【问题标题】:Set Width and Height of ItemsControl Children设置 ItemsControl 子项的宽度和高度
【发布时间】:2017-02-27 05:48:39
【问题描述】:

我的 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 包含的项目数量,它应该计算“容器”项目的宽度和高度。

我认为我可以通过调用 Measure/Arrange of the Items 方法来实现这一点。但我的代码似乎对项目的大小没有任何影响((实际)宽度或(实际)高度为 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 计算项目的宽度和高度。我做错了什么?我怎样才能完成我的计划?

【问题讨论】:

    标签: c# uwp uwp-xaml


    【解决方案1】:

    您应该编写一个适当的自定义 Panel 并重写 MeasureOverrideArrangeOverride 方法并将其分配给 ItemsControl 的 ItemsPanel 属性:

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

    CustomPanel 类可能如下所示。该控件水平排列其子元素。它可以使用 Orientation 属性进行扩展,例如 StackPanel 的属性,以水平或垂直排列其子项。

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

    【讨论】:

    • 谢谢!如何垂直定位项目?使用上述解决方案,它们垂直显示
    • 是否需要在两个方向之间切换?
    • 是的。顺便提一句。我自己想通了。我改变了var cellWidth = size.Height / Children.Count;childRect.Y += cellWidth; :)
    • 好的,添加一个 Orientation 属性,就像 StackPanel 一样。另请注意,编辑后的代码示例现在返回已排列子元素的实际大小,而不是 finalSize。您还必须针对不同的方向修改该代码。
    • 还有一个问题。当我在 ItemsControl &lt;StackPanel&gt;&lt;ItemsControl&gt;... 周围添加 Stackpanel 或 Grid 时,它不会显示任何内容,因为 availableSize.Height 设置为 0。我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多