如何限制垂直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将总是分配尽可能多的宽度。

你最好关闭编写自定义面板来实现你期望的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top