WPF XAML 和 MinWidth 和 MaxWidth

Posted

技术标签:

【中文标题】WPF XAML 和 MinWidth 和 MaxWidth【英文标题】:WPF XAML and MinWidth and MaxWidth 【发布时间】:2015-06-01 18:43:25 【问题描述】:

我有 StackPanel,我在其中包裹了 7 个不同宽度的矩形。

我在堆栈中的第一个矩形,我定义了最小和最大宽度以及默认折叠的其他矩形之一(见下文 x:Name="ToBeCollapsed"),但在特定条件下可见C#。 我的问题是,如果矩形“ToBeCollasped”折叠,第一个矩形不会拉伸到最大宽度。我的想法是,如果折叠的矩形被折叠,第一个矩形会将空间填充到“755”的 MAX。

我的逻辑错了吗?

我的布局如下:

<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。是的,StackPanel 是水平方向。已更新。 是的,StackPanel 无法按照您的想法工作。您不断增长/缩小的 Rectangle 永远不会重绘以更新布局。就像@BradleyUffner 建议的那样,只需使用网格代替,小菜一碟。 【参考方案1】:

正确设置列定义的网格可以解决问题。我自己尝试过使用一些填充颜色和较小的宽度来证明这一点,当第五列折叠时第一列会增长到空间中:

<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;
    

【讨论】:

我刚刚看到这个,我会测试一下。谢谢詹姆斯。 正是我需要的。非常感谢您提供的示例。【参考方案2】:

时刻关注幕后:

在 WPF 中,每个 LayoutControl 都是 Grid - 或可通过 Grid 重现 - 但它使用不同的 Column 或 Row 定义和 Alignment

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

每个添加的控件的列定义Auto 大小 所有添加的子控件 Horizo​​ntalAligment 为 Center 带有 * 宽度的附加列定义

这就是 cookie 摇晃的方式。

自动调整大小根据列或行中内容的大小分配空间。

这通常是可能的最小尺寸:/

所以为@Bradley Uffner +1

使用Grid,其中Columndefinition 的最小值/最大值Rectangle*

【讨论】:

好的。我在网格中执行此操作,但由于折叠矩形位于列定义中,因此在折叠矩形所在的网格中现在有 180 的间隙。有任何想法吗?我还做了 Width="*" 的第一个 RowDefinition。没有最小值或最大值。 -编辑:刚刚看到詹姆斯的评论。我要试试。

以上是关于WPF XAML 和 MinWidth 和 MaxWidth的主要内容,如果未能解决你的问题,请参考以下文章

如何在WPF中使用ListBox对键和值进行分组

WPF - 宽度为“*”的 DataGrid 列,但 MinWidth 以适合内容

WPF 窗口大小问题

【WPF】wpf加载和保存xaml文件

WPF:如何使控件在 StackPanel 中拉伸?

WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法