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?
pourquoi ne pas utiliser ItemsControl avec le panneau que vous avez commencé avec comme ItemsPanel? , oui vous devez mesurer chaque article – ZSH
ZSH S'il vous plaît écrivez comme réponse comment puis-je faire cela. – takayoshi