Указание количества элементов в строке с помощью панели-оболочки

#c# #silverlight #xaml

#c# #silverlight #xaml

Вопрос:

Я пытаюсь создать приложение, которое очень похоже на интерфейс Windows 8 Metro с плитками.. прямо сейчас, если вы нажмете на плитку, у меня появится анимация, которая увеличивает ширину и показывает больше информации об этой плитке.

У меня есть плитки, выложенные в WrapPanel, что приятно, потому что, если я изменяю размер плитки, другие плитки рядом с ней перемещаются и сохраняют ее поля идеально. Однако я некоторое время изучал это, я хотел бы, если возможно, ограничить количество элементов на панели переноса до двух в ширину (сейчас это три в ширину), как если бы вы выбрали одну из плиток, она изменяет свои размеры и помещает плитку рядом с ней (или, если это конецплитка сама переместится) в следующую строку, хотя мои анимации плавные, это выглядит не лучшим образом с точки зрения презентации..

Может ли кто-нибудь указать мне, как я мог бы указать, чтобы моя wrappanel имела ширину только в два элемента?

Любая помощь очень ценится.

Ответ №1:

Попробуйте создать свою собственную панель переноса, производную от стандартной панели переноса, как подробно описано в этом сообщении. Post решает ту же проблему, которую вы пытаетесь решить.

 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);
   }

}