WPF XAML and MinWidth and MaxWidth

7

我有一个StackPanel,其中包含7个宽度不同的矩形。

在StackPanel中的第一个矩形中,我定义了最小和最大宽度,并且另一个矩形(请参见下面的x:Name="ToBeCollapsed")默认情况下处于折叠状态,但在某种条件下,该矩形会在C#中变为可见。
我的问题是,如果矩形"ToBeCollapsed"被折叠,第一个矩形不会拉伸到最大宽度。 我的想法是,如果折叠的矩形被折叠,第一个矩形将填满到最大值"755"的空间。

我的布局如下:

<StackPanel x:Name="RectangleColumns" Width="1840" Orientation="Horizontal">

     <Rectangle MinWidth="575" MaxWidth="755" /> 
     <Rectangle Width="315"/>
     <Rectangle Width="180" />
     <Rectangle Width="180"/>
     <!--If collapsed first rectangle should grow to 755.  MinWidth + 180-->
     <Rectangle x:Name="ToBeCollapsed" Width="180"/>
     <Rectangle Width="220"/>
     <Rectangle Width="190"/>
</StackPanel>

StackPanel 应该具有水平方向吗? - Clemens
6
我觉得你最好使用网格。 - Bradley Uffner
@Clemens。是的,StackPanel 是水平方向。已更新。 - ClosDesign
是的,StackPanel不是你想象中的那样工作。你的增长/缩小的矩形将永远不会重新绘制以更新布局。就像@BradleyUffner建议的那样,只需使用Grid,非常简单。 - Chris W.
2个回答

6

如果正确设置列定义的网格将会解决问题。我自己尝试过使用一些填充颜色和较小的宽度来演示这一点,即当第五列折叠时,第一列会扩展到空间中:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0" x:Name="RectangleColumns" HorizontalAlignment="Stretch  ">
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="200" MaxWidth="400"/>
            <ColumnDefinition MaxWidth="50"/>
            <ColumnDefinition MaxWidth="50"/>
            <ColumnDefinition MaxWidth="50"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition MaxWidth="50"/>
            <ColumnDefinition MaxWidth="50"/>
        </Grid.ColumnDefinitions>

        <Rectangle Grid.Column="0" Fill="Aqua" MinWidth="200" MaxWidth="400" />
        <Rectangle Grid.Column="1" Fill="Blue" Width="50"/>
        <Rectangle Grid.Column="2" Fill="Aqua" Width="50" />
        <Rectangle Grid.Column="3" Fill="Blue" Width="50"/>            
        <Rectangle Grid.Column="4" Fill="Pink" Width="300" Name="toBeCollapsed"/>
        <Rectangle Grid.Column="5" Fill="Aqua" Width="50"/>
        <Rectangle Grid.Column="6" Fill="Blue" Width="50"/>
    </Grid>

    <Button Grid.Row="1" Content="Toggle Visibility" Name="ButtonToggle" />
</Grid>

这只是一个演示,代码被封装在后台中:

    public MainWindow()
    {
        InitializeComponent();
        ButtonToggle.Click += ButtonToggleOnClick;
    }

    private void ButtonToggleOnClick(object sender, RoutedEventArgs routedEventArgs)
    {
        toBeCollapsed.Visibility = toBeCollapsed.Visibility == Visibility.Collapsed
            ? Visibility.Visible
            : Visibility.Collapsed;
    }

我刚刚看到了这个,我会测试一下。谢谢James。 - ClosDesign
正是我需要的。非常感谢您提供的示例。 - ClosDesign

1

始终关注幕后:

在WPF中,每个LayoutControl都是一个Grid - 或者可以用Grid复制 - 但它使用不同的列或行定义和Alignment

Stackpanel是一个包含以下设置的网格(水平):

  • 对于每个添加的控件,都有一个Auto大小的Columndefinition
  • 所有添加的子控件的HorizontalAligment都为Center
  • 带*宽度的附加Columndefinition

这就是饼干的做法。

自动调整大小基于列或行中的内容的大小来分配空间。

通常是最小可能的大小 :/

所以+1给@Bradley Uffner

使用Columndefinition的Min/Max Rectangle*Grid


好的。我在一个网格中完成了这个操作,但由于折叠的矩形在列定义中,现在我的网格中有一个180的间隙。 有什么想法吗? 我还将第一行定义为Width =“*”。没有最小或最大值。-编辑:刚刚看到詹姆斯的评论。我要尝试一下。 - ClosDesign

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接