2014-04-20 2 views
0

Je voudrais créer (l'équivalent de) une coutume ItemsControl où sont placés les Item s dans un StackPanel, entremêlé avec un autre contrôle, par exemple un Button. Donc, je veux ce qui suit pour être équivalent en termes de mise en page:Articles de décoration dans ItemsControl de coutume, et non avec un ItemContainer

<StackPanel> 
    <Button>OK</Button> 
    <TextBox>Hello</TextBox> 
    <Button>OK</Button> 
    <TextBox>World</TextBox> 
</StackPanel> 

et

<CustomControlInQuestion> 
    <TextBox>Hello</TextBox> 
    <TextBox>World</TextBox> 
</CustomControlInQuestion> 

Toutes les routes alternatives que je suis allé vers le bas (ItemContainer s, ItemTemplate s, faits sur commande Panel s) n'ont pas réussi à créer tout à fait ce comportement. Y a-t-il une technique capable d'y parvenir?

Il est probablement utile de souligner que je vraiment besoin d'être un contrôle personnalisé :)

Merci!

+0

curiosité, quelle est la raison derrière cela et ne pas organiser le bouton + TextBox comme un élément unique et nous cela est votre DataTemplate pour ItemsControl –

+0

C'est parce que je suis vraiment intéressé à coller ces éléments comme des éléments de haut niveau d'une grille, et à la place des boutons, ils seraient des "GridSplitters". J'ai fait l'exemple un peu artificiel pour aller au cœur de ma question, car il y a d'autres problèmes avec l'approche Grid, donc j'espère que cela ne fera pas dérailler le sujet :) – Dan

Répondre

0

Salut Je donne juste un indice pour répondre à vos besoins, Si vous êtes familier avec ItemTemplateSelector, dataTemplate vous pouvez le faire vous-même.

<ItemsControl x:Name="PanelControl" ItemsSource="{Binding bindYourSourceHere}" 
    ItemTemplateSelector="{StaticResource bindYourItemTemplateSelector}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
</ItemsControl> 


//StackPanel is set to ItemsControl.ItemsPanel 
// Write a ItemTemplateSelector and write your own logic to select either button template or textbox template 
// In case if I misunderstood your requirement, please let me know it in more detail. 
0

Cela pourrait être un point de départ vous, une mini mise en oeuvre du panneau de pile verticale:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Markup; 

namespace TabControl1 
{ 
    public class CustomControl1 : Panel 
    { 
     protected override Size MeasureOverride (Size availableSize) 
     { 
      Size panelDesiredSize = new Size (0, 0); 

      foreach (UIElement child in this.InternalChildren) 
      { 
       var childMaxSize = new Size (double.PositiveInfinity, double.PositiveInfinity); 
       child.Measure (childMaxSize); 
       var v = (FrameworkElement)child; 

       panelDesiredSize.Width += child.DesiredSize.Width; 

       if (panelDesiredSize.Height < child.DesiredSize.Height) 
       { 
        panelDesiredSize.Height = child.DesiredSize.Height; 
       } 
      } 

      return panelDesiredSize; 
     } 

     protected override Size ArrangeOverride (Size finalSize) 
     { 
      double x = 0; 
      double y = 0; 

      foreach (UIElement child in this.InternalChildren) 
      { 
       child.Arrange (new Rect (new Point (x, y), child.DesiredSize)); 

       x += child.DesiredSize.Width; 
      } 

      return finalSize; // Returns the final Arranged size 
     } 
    } 
} 
Questions connexes