0
我需要具有這些特徵的控制:如何使,如自定義控制網格的這些要求
- 應該可以使用它在XAML來設計。
- 它應該能夠保存單個類型的多個子元素。例如說
Button
。 - 這些子元素將具有固定的尺寸。控件必須確定可以完全垂直和水平顯示的最大兒童數量(不能部分顯示任何兒童)。只顯示這些孩子,但保留不可見的孩子以備後用。 - 我想我可以通過
Grid
完成這項要求。 - 應該可以爲這些子元素設置動畫 - 我想這不是問題。
我試圖寫一個自定義控件來做到這一點。我從Grid
繼承,並看到Grid
implements IAddChild
我認爲如果我覆蓋AddChild
,我可以捕獲添加的元素。但是現在我發現Grid
中的AddChild
也沒有實現!所以看來我不能這樣做。我應該從哪裏開始?
編輯:感謝艾倫的三分球,我得到它的工作...
public class AutoLayoutingPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
Size size = new Size();
size.Height = double.MaxValue;
size.Width = double.MaxValue;
foreach (UIElement child in Children)
{
child.Measure(size);
size.Height += child.DesiredSize.Height;
size.Width += child.DesiredSize.Width;
}
return availableSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
ArrangeGrid(finalSize);
return finalSize;
}
private void ArrangeGrid(Size finalSize)
{
foreach (UIElement child in Children)
{
child.Visibility = Visibility.Hidden;
}
Size maxCellSize = new Size();
foreach (UIElement child in Children)
{
maxCellSize.Height = Math.Max(child.DesiredSize.Height, maxCellSize.Height);
maxCellSize.Width = Math.Max(child.DesiredSize.Width, maxCellSize.Width);
}
int rowCount = (int)Math.Floor(finalSize.Height/maxCellSize.Height);
int colCount = (int)Math.Floor(finalSize.Width/maxCellSize.Width);
int row = 0, col = 0;
foreach (UIElement child in Children)
{
if (row < rowCount && col < colCount)
{
Rect pos = new Rect(col * maxCellSize.Width, row * maxCellSize.Height, maxCellSize.Width, maxCellSize.Height);
child.Visibility = System.Windows.Visibility.Visible;
child.Arrange(pos);
}
else
{
break;
}
if (++row >= rowCount)
{
row = 0;
++col;
}
}
}
}