如何以这种方式调整WPF Grid面板的大小?

Ign*_*cia 3 .net c# wpf xaml grid-layout

我有一个非常简单的窗口,其中一个Grid包含两列,一个TextBlock和一个TextBox.

在此输入图像描述

我需要它将列0设置为自动调整其内容大小,并使列1(内容)为列0大小的4倍.

我怎样才能做到这一点.如果这是解决方案,我将创建一个Grid后代,因为我真的需要这个功能.

编辑:更多解释.第0列的内容在运行时不会更改,因此第0列或第1列的大小在运行时不得更改.网格将是配置的窗口的子节点,SizeToContent="WidthAndHeight"因此不存在额外的空间.

对德米特里的回答:我用下面的代码尝试了你说的话,它根本不起作用:

<Window x:Class="UnderstandSizing.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" 
SizeToContent="WidthAndHeight" >
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".25*" />
        <ColumnDefinition Width=".75*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Column="0" Text="THIS IS THE LABEL:" />
    <TextBox Grid.Column="1" Text="content" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

最后编辑:为什么我(或任何人)需要这个?

WPF的一个好处是它无法在没有固定尺寸的情况下工作吗?如果你有缺陷并且你有更大的字体大小,一切都会好看.如果您将UI翻译成另一种需要x2大小的语言,一切都会好起来的.如果您有不同的PPI设置,一切都会好看.

但是我不希望看到的是屏幕在运行时改变它的大小,因为用户不习惯这个.这就是为什么我想将输入字段的大小设置为知道字段的倍数.如果我让标签单元格重新调整到需要的大小,然后我将内容单元格设置为标签的乘数,我将获得自动调整的好处,以及用户期望具有固定大小屏幕的行为(除非他们更改大小调整大小)它).

Lou*_*ann 6

您可以在网格列上使用绑定:

<Grid.ColumnDefinitions>
   <ColmunDefinition Width="Auto" x:Name="firstCol"/>
   <ColumnDefinition Width="{Binding ActualWidth, ElementName=firstCol, Converter={StaticResource MultiplyConverter}, ConverterParameter=4}" />
</Grid.ColumnDefinitions>
Run Code Online (Sandbox Code Playgroud)

那么转换器:

public class MultiplyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double originalValue;
        double multiplier;
        if (value != null && parameter != null && 
            double.TryParse(value.ToString(), out originalValue) &&
            double.TryParse(parameter.ToString(), out multiplier)) //Can be lots of things: sentinel object, NaN (not a number)...
        {
            return originalValue * multiplier;
        }
        else return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以为网格列编写附加属性.