昨天我问如何让 ItemsControl 使其子项均匀分布在可用空间中;在愉快地阅读答案后,我写了(实际上是复制并调整了它)我自己的“stretchpanel”,它正是我想要的。然而,我的孩子应该在右侧有一个边框,只要孩子比其内容大,它就可以工作。一旦它变小,边框就会消失,我不知道为什么(因此,不修复它)。下面您可以找到我的视图和拉伸面板中覆盖方法的简化版本,使用this样品作为基础。预先非常感谢。
<Grid Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ItemsControl x:Name="HorizontalListBox" Background="Blue" HorizontalAlignment="Left" HorizontalContentAlignment="Left" >
<ItemsControl.Items>
<System:String>Test</System:String>
<System:String>Test</System:String>
<System:String>This demonstrates the problem exceptionally well</System:String>
<System:String>Test</System:String>
<System:String>Test</System:String>
</ItemsControl.Items>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Controls:StretchPanel Orientation="Horizontal" HorizontalAlignment="Stretch"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Background="Yellow" HorizontalAlignment="Stretch">
<TextBlock Text="{Binding}" HorizontalAlignment="Stretch"/>
<Border BorderBrush="Black" BorderThickness="0,0,1,0"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
protected override Size MeasureOverride(Size availableSize)
{
var size = new Size();
SetSide(ref size, GetSide(availableSize));
foreach (UIElement child in Children)
{
child.Measure(availableSize);
SetOtherSide(ref size, Math.Max(GetOtherSide(size), GetOtherSide(child.DesiredSize)));
}
_measureSize = size;
return size;
}
protected override Size ArrangeOverride(Size finalSize)
{
double offset = 0;
var Side = GetSide(_measureSize) / Children.Count;
var Rest = GetSide(_measureSize) % Children.Count;
foreach (UIElement child in Children)
{
double side = Math.Floor(GetSide(_measureSize) / Children.Count);
if (Rest > 0)
{
side++;
Rest--;
}
var final = new Size();
SetSide(ref final, side);
SetOtherSide(ref final, GetOtherSide(finalSize));
child.Arrange(new Rect(GetOffsetPoint(offset), final));
offset += side;
}
return finalSize;
}
如果您像这样编写 StretchPanel ,它会工作,它以零宽度和高度测量其子元素:
public class StretchPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement element in Children)
{
element.Measure(new Size());
}
return new Size();
}
protected override Size ArrangeOverride(Size finalSize)
{
for (int i = 0; i < Children.Count; i++)
{
int x1 = (int)(finalSize.Width / Children.Count * i);
int x2 = (int)(finalSize.Width / Children.Count * (i + 1));
Children[i].Arrange(new Rect(x1, 0, x2 - x1, finalSize.Height));
}
return finalSize;
}
}
然后设置HorizontalAlignment="Stretch"
(或者根本不设置它,因为这是默认值)在 ItemsControl 上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)