限制StackPanel中的宽度最小的子元素
-
22-08-2019 - |
题
如何限制垂直WPF StackPanel
的宽度到它包含最狭窄的项目。该StackPanel
的宽度必须不大于任何其他子元素的宽度大。
解决方案
不幸的是,的IValueConverter 办法并不总是可行的;如果孩子被添加到的的StackPanel 的静态,例如,孩子收集将在绑定的时间空(所以我发现)。最简单的解决方案是创建一个定制面板:
public class ConstrainedStackPanel : StackPanel
{
public ConstrainedStackPanel()
{
}
protected override Size MeasureOverride(Size constraint)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
constraint.Width = Math.Min(element.Width, constraint.Width);
}
return base.MeasureOverride(constraint);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
arrangeSize.Width = Math.Min(element.Width, arrangeSize.Width);
}
return base.ArrangeOverride(arrangeSize);
}
}
可以使用面板由以下XAML所示:
<StackPanel Margin="5">
<TextBlock Text="StackPanel:" FontWeight="Bold" />
<StackPanel x:Name="panelA">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</StackPanel>
<TextBlock Text="ConstrainedStackPanel:" FontWeight="Bold" Margin="0,10,0,0" />
<l:ConstrainedStackPanel x:Name="panelB">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</l:ConstrainedStackPanel>
</StackPanel>
这会使类似如下:
我希望这有助于。
其他提示
我曾尝试绑定到ActualWidth的财产,甚至创造一个转换器,以抵消值,而这个伟大工程,但有一个例外:当你扩展容器的大小,宽度适当的更新,但是,当使容器较小的,实际内容的宽度变小,但任何scrollviewers的“页宽”不会。我敢肯定有办法解决这个问题,但我还没有发现它。
您不能。作为其子请求的垂直定向StackPanel
将总是分配尽可能多的宽度。
你最好关闭编写自定义面板来实现你期望的行为。
不隶属于 StackOverflow