使用比例网格大小(*)时如何自动限制行/列的最小大小?

时间:2018-07-04 17:07:04

标签: c# wpf xaml

假设我们有一个简单的窗口:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Width="300" Height="300">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Margin="2,2,2,2">
            <TextBlock
                Text="Button 1.&#x0a;It has some text.&#x0a;Button shouldn't shrink less then the text size."
                TextWrapping="WrapWithOverflow" />
        </Button>
        <Button Grid.Row="1" Content="Button 2" Margin="2,2,2,2" />
    </Grid>
</Window>

Normal size

似乎还可以。但是,调整大小后,上方按钮的内容将被裁剪: Small size

所需的布局应如下所示:

Desired behaviour

在文本中:使行高与MinHeight等于它的Auto高度成比例(*)。换句话说,将Height设为Max(1*,Auto)

我假设如果WPF设置为Auto时能够自动确定行的大小,那么应该有一种方法使它在按比例调整大小时尊重该大小。

我找到了一些相关的问题(12),但无法将那里使用的技术适应我的情况。

目前唯一的结果是

  • 绑定Button.MinHeight到嵌套的TextBlock.ActualHeight
  • 在后面的代码中:枚举放在第一行的所有网格的子代,找到最大的MinHeight,将其设置为RowDefinition.MinHeight。因为按钮比文本块大,所以显得block脚。

是否可能需要与Measure & Arrange相关的内容?还是不值得付出努力,最好手动放置MinHeight(并且本地化字符串的长度差异也存在一些问题)?

1 个答案:

答案 0 :(得分:1)

这是一个快速简便的技巧。

复制控件(并将其隐藏)并使用其度量值来找到MinHeight

<Grid>
    <Grid x:Name="dummyControl" VerticalAlignment="Center">
        <Button Grid.Row="0" Margin="2,2,2,2" Visibility="Hidden" IsHitTestVisible="False">
            <TextBlock
                Text="Button 1.&#x0a;It has some text.&#x0a;Button shouldn't shrink less then the text size."
                TextWrapping="WrapWithOverflow" />
        </Button>
    </Grid>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="{Binding ElementName=dummyControl, Path=ActualHeight}" Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Button Grid.Row="0" Margin="2,2,2,2">
            <TextBlock
                Text="Button 1.&#x0a;It has some text.&#x0a;Button shouldn't shrink less then the text size."
                TextWrapping="WrapWithOverflow" />
        </Button>
        <Button Grid.Row="1" Content="Button 2" Margin="2,2,2,2" />
    </Grid>
</Grid>
VerticalAlignment中的

dummyControl应该不是Stretch