2012-12-10 2 views
1

J'ai besoin de créer un analogue UniformGrid pour le métro.itemscontrol personnalisé pour metro: uniformgrid

J'ai écrit ce

public class UniformGrid : Panel 
{ 
    public static readonly DependencyProperty HorizontalCountProperty = 
     DependencyProperty.Register("HorizontalCount", typeof (int), typeof (UniformGrid), 
            new PropertyMetadata(default(int))); 

    public int HorizontalCount 
    { 
     get { return (int) GetValue(HorizontalCountProperty); } 
     set { SetValue(HorizontalCountProperty, value); } 
    } 

    public static readonly DependencyProperty ElementsGapProperty = 
     DependencyProperty.Register("ElementsGap", typeof (double), typeof (UniformGrid), 
            new PropertyMetadata(default(double))); 

    public double ElementsGap 
    { 
     get { return (double) GetValue(ElementsGapProperty); } 
     set { SetValue(ElementsGapProperty, value); } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     return new Size(); 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     if (Children != null && Children.Count != 0) 
     { 
      var squareSideForElement = (finalSize.Width - (HorizontalCount - 1)*ElementsGap)/HorizontalCount; 
      var sizeOfElement = new Size(squareSideForElement, squareSideForElement); 
      for (var i = 0; i < Children.Count; i++) 
      { 
       var rowIndex = i%HorizontalCount; 
       var columnIndex = i/HorizontalCount; 
       var resultPoint = new Point 
        { 
         X = rowIndex*(squareSideForElement + ElementsGap), 
         Y = columnIndex*(squareSideForElement + ElementsGap) 
        }; 
       Children[i].Arrange(new Rect(resultPoint, sizeOfElement)); 

      } 

     } 
     return finalSize; 
    } 
} 

Mais après avoir compris que je besoin d'un contrôle dérivé de ItemsControl parce que je besoin ItemTemplate, ItemsSource etc.

J'ai fait ce

public class UniformGrid : ItemsControl 
{ 
    public static readonly DependencyProperty HorizontalCountProperty = 
     DependencyProperty.Register("HorizontalCount", typeof (int), typeof (UniformGrid), 
            new PropertyMetadata(default(int))); 

    public int HorizontalCount 
    { 
     get { return (int) GetValue(HorizontalCountProperty); } 
     set { SetValue(HorizontalCountProperty, value); } 
    } 

    public static readonly DependencyProperty ElementsGapProperty = 
     DependencyProperty.Register("ElementsGap", typeof (double), typeof (UniformGrid), 
            new PropertyMetadata(default(double))); 

    public double ElementsGap 
    { 
     get { return (double) GetValue(ElementsGapProperty); } 
     set { SetValue(ElementsGapProperty, value); } 
    } 

    protected override Size MeasureOverride(Size availableSize) 
    { 
     return new Size(); 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     if (Items != null && Items.Count != 0) 
     { 
      var squareSideForElement = (finalSize.Width - (HorizontalCount - 1)*ElementsGap)/HorizontalCount; 
      var sizeOfElement = new Size(squareSideForElement, squareSideForElement); 
      for (var i = 0; i < Items.Count; i++) 
      { 
       var rowIndex = i%HorizontalCount; 
       var columnIndex = i/HorizontalCount; 
       var resultPoint = new Point 
        { 
         X = rowIndex*(squareSideForElement + ElementsGap), 
         Y = columnIndex*(squareSideForElement + ElementsGap) 
        }; 
       Items[i].Arrange(new Rect(resultPoint, sizeOfElement)); 

      } 

     } 
     return finalSize; 
    } 
} 

Mais je erreur sur la ligne

Items[i].Arrange(new Rect(resultPoint, sizeOfElement)); 

Je comprends raison de ces erreurs.

Mes questions sont

1) Comment puis-je obtenir modèle d'élément pour cet élément rempli de données fournies par la liaison?

2) Est-il nécessaire d'appeler Measure pour chaque élément de MeasureOverride?

+0

pourquoi ne pas utiliser ItemsControl avec le panneau que vous avez commencé avec comme ItemsPanel? , oui vous devez mesurer chaque article – ZSH

+0

ZSH S'il vous plaît écrivez comme réponse comment puis-je faire cela. – takayoshi

Répondre

2

quelque chose comme:

<ItemsControl ItemsSource="{Binding Items}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <!-- your item template--> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <UniformGrid/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
Questions connexes