【问题标题】:Star sizing is behaving like Auto?星级大小的行为类似于 Auto?
【发布时间】:2012-06-22 14:18:25
【问题描述】:

我对 WPF Grid 控件的行为感到很困惑。

这是我能得到的最简单的复制品:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" MinHeight="100" MaxHeight="300" />
            <RowDefinition Height="0.1*" MinHeight="100" />
        </Grid.RowDefinitions>
        <Button Grid.Row="0" Height="200" />
        <Button Grid.Row="1" />
    </Grid>
</Window>

如果你运行它并缩小窗口,你会注意到底部按钮在顶部按钮开始缩小之前被剪掉了。

您可以通过从按钮中删除 Height="200" 来获得所需的行为。但是,在我的实际用例中,按钮被替换为包含 ScrollViewer 的 Border。虽然我没有明确地设置任何一个高度(但我做了一个 ScrollViewer 的内容),但可以看到相同的剪裁行为。

那么问题来了:

如何让行忽略其内容的高度?或者有没有其他方法可以达到同样的效果?

【问题讨论】:

  • 我不确定我是否理解这个问题。你的第一个按钮有一个固定的大小,除非父母告诉他否则无论如何他都会使用那个高度。即使 Parent 告诉他只使用 100 它只会剪辑它,设置固定大小意味着控件具有固定大小。在这种情况下,RowDefinition 中的 Star 完全没有任何作用。如果您删除第一个按钮中的高度,您将到达第一行达到其最小高度的点,WPF 没有其他选择,只能将第二行移出视图。
  • +1 用于提供一个小的、可重现的问题代码示例 :)
  • @dowhilefor:我知道第二行最终会被剪掉。我计划为窗口添加一个最小高度来防止这种情况。问题是按钮的高度似乎比其他情况下保持的行更大。
  • @KendallFrey 我不这么认为,您的按钮高度为 200,而您的行允许最大高度为 300。在您的网格上启用 ShowGridLines,以查看网格的实际单元格,也许这可以让您更好地了解网格是如何调整大小的。我在 Xamlpad 中尝试了您的代码。如果窗口高度很大,则填充下一行内容,上一行内容正好是 200 并且在第一行居中。如果我缩小窗口,第一行会变小,直到达到其内容的高度,然后第二行开始缩小,最后会移出窗口
  • @dowhilefor:我认为这很好地描述了这种行为。我想要的是保持第二个按钮不会被剪裁,直到第一行达到其最小高度。

标签: .net wpf xaml


【解决方案1】:

您的最小网格大小为 300(第 1 行为 200,第 2 行为 100),因此您的最小 Grid 将是 300。如果您将窗口缩小到该大小以下,它只是剪裁了 Grid 和隐藏它的一部分,而不是缩放它。

也许您可以改用DockPanel

<DockPanel>
    <Button DockPanel.Dock="Bottom" MinHeight="100" />
    <Button Grid.Row="0" Height="200" MinHeight="100" MaxHeight="300"  />
</DockPanel>

这样,您的底部将始终停靠在屏幕底部,而其他内容会占用剩余空间。

如果你真的想保持你的大小比例,我建议你使用一个转换器,将你的内容控件的高度设置为窗口大小的百分比。

<DockPanel x:Name="Parent">
    <Button DockPanel.Dock="Bottom" MinHeight="100" 
            Height="{Binding ActualHeight,
                             ElementName=Parent, 
                             Converter={StaticResource PercentConverter}, 
                             ConverterParameter=0.1}" />
    <Button Grid.Row="0" Height="200" MinHeight="100" MaxHeight="300"  />
</DockPanel>

【讨论】:

  • 我不明白最小尺寸为 300 的部分。100 + 100 = 200。此外,如果我将窗口调整得足够小,顶行会缩小,直到最小尺寸。
  • @KendallFrey 不,按钮上的高度比行的最小高度更重要,实际上它只是一个最小高度。但是您的按钮希望高度为 200,因此在 MaxHeight 为 300 的情况下,该行只允许该按钮。所以这给你 200(固定按钮高度)+ 100(第二行最小高度)= 300。
  • @dowhilefor:那为什么行不总是保持 >= 200?如果窗口变得足够小,则该行将缩小到按钮大小以下。
  • @KendallFrey 您的Button 大小使第一行的最小大小为200。网格会拉伸其行以适应其内容大小,并且不会剪切内容以适应行大小。
  • 好的,我开始明白为什么它不起作用了。但我仍然没有解决方案。我尝试了 DockPanel,但它没有根据需要展开底行。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 2011-12-11
  • 2012-12-18
  • 2013-03-19
  • 2019-03-08
  • 2016-01-27
  • 1970-01-01
相关资源
最近更新 更多