Мне нужен элемент управления, имеющий следующие функции:
- Должно быть возможно использовать его в xaml для разработки.
- Он должен содержать несколько дочерних элементов одного типа. Например,
Button
.
- Эти дочерние элементы будут иметь фиксированные размеры. Элемент управления должен выяснить, какое максимальное количество дочерних элементов он может полностью отобразить по вертикали и горизонтали (частично не может показать ни одного дочернего элемента). И показывать только этих детей, но оставлять их невидимыми для дальнейшего использования. - Я думаю, что я могу выполнить это требование с
Grid
.
- Должна быть возможность анимировать эти дочерние элементы - я думаю, это не проблема.
Я пытался написать собственный элемент управления для этого. Я унаследовал от Grid
и, увидев, что Grid
реализует IAddChild
, я подумал, что смогу отловить добавляемые элементы, если переопределю AddChild
. Но теперь я обнаружил, что для AddChild
в Grid
также нет реализации! Кажется, я не могу так поступить. С чего мне начать?
РЕДАКТИРОВАТЬ: Благодаря указателям Алана, я получил это работает ...
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;
}
}
}
}