2017-02-24 77 views
0

我CustomItemsControl如下所示:設置寬度和ItemsControl的兒童的身高

<local:CustomItemsControl x:Name="CustomItemsControl" > 
     <local:CustomItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Border x:Name="rectangle" Background="Orange" CornerRadius="5" /> 
      </DataTemplate> 
     </local:CustomItemsControl.ItemTemplate> 
    </local:CustomItemsControl> 

取決於哪個我CustomItemsControl包含,它應該計算寬度和「容器」的相關文件高度的物品的數量。

我想我可以通過調用項目的Measure/Arrange方法來實現。但我的代碼似乎並不具有((實際)寬度或(實際)高度爲NaN或0)

public class CustomItemsControl : ItemsControl 
{ 
    protected override Size MeasureOverride(Windows.Foundation.Size availableSize) 
    { 
     Windows.Foundation.Size size = base.ArrangeOverride(availableSize); 
     if (ItemsSource != null) 
     { 
      double CellWidth = size.Width/Items.Count; 
      foreach (var Item in Items) 
      { 
       DependencyObject Container = ContainerFromItem(Item); 
       if(Container!=null) 
       { 
        FrameworkElement Element = Container as FrameworkElement; 
        //Element.Width = CellWidth; 
        //Element.Height = CellWidth; 
        Element.Measure(new Size(CellWidth, CellWidth)); 
        Element.Arrange(new Rect(0, 0, CellWidth, CellWidth)); 
       } 

      } 
     } 
     return size; 
    } 
} 

該項目將不會,除非你設置的寬度和高度顯示在項目的大小產生任何影響的邊界(例如10)。我嘗試完成我的CustomItemsControl計算項目的寬度和高度。我做錯了什麼?我怎樣才能完成我的計劃?

回答

1

你應該寫一個適當的定製Panel與重寫MeasureOverrideArrangeOverride方法並將其分配給一個ItemsControl的ItemsPanel屬性:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <local:CustomPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border ... /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

CustomPanel類可能看起來像如下所示。控件水平排列其子元素。它可以使用像StackPanel之類的Orientation屬性進行擴展,以便水平或垂直排列其子項。

public class CustomPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     var size = new Size(); 

     if (double.IsInfinity(availableSize.Width)) // availableSize may be infinite 
     { 
      availableSize.Width = RenderSize.Width; 
     } 

     if (Children.Count > 0) 
     { 
      var cellWidth = availableSize.Width/Children.Count; 
      var childSize = new Size(cellWidth, cellWidth); 

      foreach (var child in Children) 
      { 
       child.Measure(childSize); 
      } 

      size.Width = availableSize.Width; 
      size.Height = cellWidth; 
     } 

     return size; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     var size = new Size(); 

     if (Children.Count > 0) 
     { 
      var cellWidth = finalSize.Width/Children.Count; 
      var childRect = new Rect(0, 0, cellWidth, cellWidth); 

      foreach (var child in Children) 
      { 
       child.Arrange(childRect); 
       childRect.X += cellWidth; 
      } 

      size.Width = finalSize.Width; 
      size.Height = cellWidth; 
     } 

     return size; 
    } 
} 
+0

謝謝!我怎樣才能定位項目垂直?使用上述解決方案,它們顯示爲垂直 – Briefkasten

+0

您是否需要在兩個方向之間切換? – Clemens

+1

是的。順便說一句。我自己想出來了。我改變了'var cellWidth = size.Height/Children.Count;'和'childRect.Y + = cellWidth;':) – Briefkasten