网格忽略 WPF 中的 ClipToBounds

Posted

技术标签:

【中文标题】网格忽略 WPF 中的 ClipToBounds【英文标题】:Grid ignores ClipToBounds in WPF 【发布时间】:2016-07-16 22:21:12 【问题描述】:

给定一个非常基本的Grid,将ColumnDefinition 的宽度设置为*,其中包含的按钮的硬编码宽度属性将被忽略,并且这些子元素被剪裁。它们不会被设置为Auto 的宽度剪裁。

如果在每个ColumnDefinition 上设置了正确的MinWidths,则可以防止这种剪辑,但这不是完全动态的。

我做错了什么还是这是最好的 WPF?

变成

标记:

    <Grid ShowGridLines="True" ClipToBounds="False">
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
            <Button Grid.Column="0" Width="120">AAAAA</Button>
            <Button Grid.Column="1" Width="120">BBBB</Button>
            <Button Grid.Column="2" Width="120">CCCCC</Button>
    </Grid>

我希望按钮在有空间时显示为第一张图片,在没有空间时显示为第三张图片(即在任何情况下都没有剪辑)。

【问题讨论】:

您能否为窗口最小化时想要发生的事情添加图表?按钮总是 120 宽度还是您希望它们随着窗口大小的调整而缩小?谢谢 @SWilko 更新问题 【参考方案1】:

啊,我已经解决了如下:

关键是ColumnDefinition中的MinWidth属性。

 <Grid ShowGridLines="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="Binding Path=ActualWidth, ElementName=spLeft "></ColumnDefinition>
            <ColumnDefinition MinWidth="Binding Path=ActualWidth, ElementName=spMid "></ColumnDefinition>
            <ColumnDefinition MinWidth="Binding Path=ActualWidth, ElementName=spRight "></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel Background="Red" Grid.Column="0" Name="spLeft" HorizontalAlignment="Center">
            <Button  Width="120">AAAAA</Button>
        </StackPanel>
        <StackPanel Background="Green" HorizontalAlignment="Center" Grid.Column="1" Name="spMid">
            <Button  Width="120">BBBB</Button>
        </StackPanel>
        <StackPanel Background="Blue" Name="spRight" Grid.Column="2" HorizontalAlignment="Center">
            <Button  Width="120">CCCCC</Button>
        </StackPanel>
    </Grid>

【讨论】:

【参考方案2】:

只需在 Grid 中添加一个 MinWidth:

<Grid ShowGridLines="True" ClipToBounds="False" MinWidth="360">
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
        <Button Grid.Column="0" Width="120">AAAAA</Button>
        <Button Grid.Column="1" Width="120">BBBB</Button>
        <Button Grid.Column="2" Width="120">CCCCC</Button>
</Grid>

【讨论】:

您好 Arnaud,感谢您的回答。我正在寻找一种不需要我硬编码文字minwidth 的动态方法。请参阅我对这个解决方案的回答。 嗨 Maxp,从技术上讲,这是对您问题的正确答案,尽管我可以理解您想要一些您没有表达过的东西。无论如何,MinWidth 就是答案。

以上是关于网格忽略 WPF 中的 ClipToBounds的主要内容,如果未能解决你的问题,请参考以下文章

WPFのclipToBounds与maskToBounds的区别

WPF 剪辑矩形

WPF处理内容溢出

WPF扩展器单击事件上的展开/折叠网格列

保持网格中心并最小化/最大化 WPF 网格中的拉伸

冻结wpf数据网格中的列