C# 设置项控件子项的宽度和高度
我的CustomItemsControl如下所示:C# 设置项控件子项的宽度和高度,c#,uwp,uwp-xaml,C#,Uwp,Uwp Xaml,我的CustomItemsControl如下所示: <local:CustomItemsControl x:Name="CustomItemsControl" > <local:CustomItemsControl.ItemTemplate> <DataTemplate> <Border x:Name="rectangle" Background="Orange" Corner
<local:CustomItemsControl x:Name="CustomItemsControl" >
<local:CustomItemsControl.ItemTemplate>
<DataTemplate>
<Border x:Name="rectangle" Background="Orange" CornerRadius="5" />
</DataTemplate>
</local:CustomItemsControl.ItemTemplate>
</local:CustomItemsControl>
除非您设置边框的宽度和高度(例如10),否则不会显示项目。我尝试实现CustomItemsControl计算项目的宽度和高度。我做错了什么?如何完成我的计划?您应该使用覆盖的
测量覆盖
和排列覆盖
方法编写一个适当的自定义面板
,并将其分配给Items控件的ItemsPanel
属性:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:CustomPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border ... />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
谢谢我如何将项目垂直定位?使用上述解决方案,它们将垂直显示。是否需要在两个方向之间切换?是。顺便说一句,这是我自己想出来的。我改变了
var cellWidth=size.Height/Children.Count代码>和childRect.Y+=cellWidth代码>:)好的,像StackPanel一样添加方向属性。还要注意,编辑的代码示例现在返回排列的子元素的实际大小,而不是finalSize
。您还必须修改代码以适应不同的方向。还有一个问题。当我在ItemsControl周围添加Stackpanel或Grid时,…
不会显示任何内容,因为availableSize.Height
设置为0
。我怎样才能解决这个问题?
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<local:CustomPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border ... />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
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;
}
}