如何在一定宽度以上按比例调整2列的大小,但是当表格在该宽度以下时才调整1列的大小?

时间:2019-04-16 14:31:47

标签: wpf xaml

我有一个WPF应用程序,在主窗口中有2个网格列。调整大小时,我希望右边的列永远不会低于220宽度,但是左边的列会继续缩小。如果窗口足够扩展,我希望两列都按比例扩展,左列的大小是右列的两倍。我以为可以通过以下XAML来实现这一目标...

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="2*"/>
    <ColumnDefinition Width="1*" MinWidth="220"/>
</Grid.ColumnDefinitions>

但是发生的是,当右列达到220时,它们都停止调整大小,并且窗口仅在右列上关闭(开始覆盖控件),如下图所示。我现在知道为什么要这样做了,但是我不知道如何使它按我希望的方式发挥作用。

这是表格的总宽度约为660时的样子 This is what it looks like when the form is around 660 total width

这是被压缩到660以下时的样子 This is what it looks like when squeezed below 660

这是我希望它在660以下受到挤压时的样子 This is what I want it to look like when squeezed below 660

1 个答案:

答案 0 :(得分:0)

应用一个DataTrigger,如果第2列的ActualWidth等于第2列的MinWidth,则将Width更改为auto到列的ColumnDifinition 1应该实现您的目标。

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*">
            <ColumnDefinition.Style>
                <Style TargetType="ColumnDefinition">
                    <Style.Triggers>
                        <DataTrigger Value="True">
                            <DataTrigger.Binding>
                                <MultiBinding Converter="{StaticResource eqCvrt}">
                                    <Binding ElementName="c2" Path="ActualWidth"/>
                                    <Binding ElementName="c2" Path="MinWidth"/>
                                </MultiBinding>
                            </DataTrigger.Binding>
                            <Setter Property="Width" Value="auto"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ColumnDefinition.Style>
        </ColumnDefinition>
        <ColumnDefinition Width="1*" MinWidth="220" Name="c2"/>
    </Grid.ColumnDefinitions>

public class EqualityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return Object.Equals(values[0], values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return null;
    }
}