Указание количества элементов в строке с помощью WrapPanel
Я пытаюсь создать приложение, похожее на Windows 8 Metro UI с плитками... прямо сейчас, если вы нажмете на плитку, у меня будет анимация, которая увеличивает ширину и показывает больше информации об этой плитке.
У меня есть плитки, выложенные в WrapPanel, и это хорошо, потому что, если я изменю размер плитки, другие плитки рядом с ней будут двигаться и сохранять ее поле идеально. Как бы то ни было, я изучал это некоторое время, и я хотел бы, если возможно, ограничить количество элементов в панели переноса двумя ширинами (сейчас это три ширины), как будто вы выбираете одну из плиток, она изменяет размеры и выталкивает плитку. рядом с ним (или, если это конечный тайл, он будет перемещаться) к следующему ряду, в то время как моя анимация плавная, она выглядит не лучшим образом с точки зрения представления.
Может ли кто-нибудь указать мне, как я могу указать свою обертку для ширины всего в два элемента?
Любая помощь очень ценится.
1 ответ
Попробуйте создать собственную панель переноса, полученную из стандартной панели переноса, как подробно описано в этом посте. Почта затрагивает ту же проблему, которую вы пытаетесь решить.
public class MyWrapPanel : WrapPanel
{
public int MaxRows
{
get { return (int)GetValue(MaxRowsProperty); }
set { SetValue(MaxRowsProperty, value); }
}
public static readonly DependencyProperty MaxRowsProperty =
DependencyProperty.Register("MaxRows", typeof(int), typeof(MyWrapPanel), new UIPropertyMetadata(4));
protected override Size ArrangeOverride(Size finalSize)
{
Point currentPosition = new Point();
double ItemMaxHeight = 0.0;
int RowIndex = 0;
foreach (UIElement child in Children)
{
ItemMaxHeight = ItemMaxHeight > child.DesiredSize.Height ? ItemMaxHeight : child.DesiredSize.Height;
if (currentPosition.X + child.DesiredSize.Width > this.DesiredSize.Width)
{
currentPosition = new Point(0, currentPosition.Y + ItemMaxHeight);
ItemMaxHeight = 0.0;
RowIndex++;
}
if (RowIndex < MaxRows)
{
child.Visibility = System.Windows.Visibility.Visible;
Rect childRect = new Rect(currentPosition, child.DesiredSize);
child.Arrange(childRect);
}
else
{
Rect childRect = new Rect(currentPosition, new Size(0,0));
child.Arrange(childRect);
}
currentPosition.Offset(child.DesiredSize.Width, 0);
}
return finalSize;
}
protected override Size MeasureOverride(Size availableSize)
{
return base.MeasureOverride(availableSize);
}
}