首页 文章

设置ItemsControl Children的宽度和高度

提问于
浏览
0

我的CustomItemsControl如下所示:

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

根据我的CustomItemsControl包含的项目数量,它应该计算“容器”项的宽度和高度 .

我以为我可以通过调用项目的测量/排列方法来实现这一点 . 但是我的代码似乎对项目的大小没有任何影响((实际)宽度或(实际)高度是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 回答

  • 1

    您应该使用重写的 MeasureOverrideArrangeOverride 方法编写适当的自定义 Panel 并将其分配给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;
        }
    }
    

相关问题