WPF 将 Grid 列宽度设置为最大宽度,即使在 SharedSizeGroup 上折叠

问题描述 投票:0回答:0

我有一个简单的

Grid
,有 2 列和 5 行。这些行中只有 2 行一次可见。根据第一行中
ComboBox
的选择,其他行的可见性会发生变化,并显示不同的
UserControl
。第一列是一个
Label
,它应该描述第二列中
UserControl
的用途(即“名称”,“密码”等)。当
Grid
第一次显示时,第二行是
Visible
,其他是
Collapsed
。 'Name' 只有四个字母,例如 'Password' 有 8 个字母,所以
Column.Width
改变了。所以 GUI 看起来不稳定。我想要的是
Column.Width
绑定到最大(即使是暂时
Collapsed
)大小的
Column
。我们在这里使用不同语言的语言文件,所以我无法将第一个
Column
的大小设置为固定数量。

到目前为止这是我的代码:

<Window ...
    ResizeMode="NoResize" SizeToContent="WidthAndHeight">
...
<StackPanel Grid.IsSharedSizeScope="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="LabelColumn" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <Label Grid.Column="0" Content="{x:Static base:AppStrings.SecurityMethods}" />
        <ComboBox Grid.Column="1" ItemsSource="{Binding SecurityModes, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding SelectedSecurityMode}" />
    </Grid>

    <Grid Visibility="{Binding SelectedSecurityMode, Converter={StaticResource EqualToVisibilityConverter}, ConverterParameter=Password}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="LabelColumn" />
            <ColumnDefinition Width="250" />
        </Grid.ColumnDefinitions>
                        
        <Label Grid.Column="0" Content="{x:Static base:AppStrings.Password}" />
        <wpfControls:TextBoxEx Grid.Column="1" Text="{Binding Password}" />
    </Grid>

    <Grid Visibility="{Binding SelectedSecurityMode, Converter={StaticResource EqualToVisibilityConverter}, ConverterParameter=Sms}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="LabelColumn" />
            <ColumnDefinition Width="250" />
        </Grid.ColumnDefinitions>
                        
        <Label Grid.Column="0" Content="{x:Static base:AppStrings.MobileNumber}" />
        <wpfControls:PhoneNumberControl Grid.Column="1" PhoneNumber="{Binding MobileNumber}" />
    </Grid>

    <Grid Visibility="{Binding SelectedSecurityMode, Converter={StaticResource EqualToVisibilityConverter}, ConverterParameter=Email}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="LabelColumn" />
            <ColumnDefinition Width="250" />
        </Grid.ColumnDefinitions>

        <Label Grid.Column="0" Style="{StaticResource LabelDefaultStyle}" Content="{x:Static base:AppStrings.EmailAddress}" />
        <wpfControls:TextBoxEx Grid.Column="1" Text="{Binding EmailAddress}" />
    </Grid>

    <Grid Visibility="{Binding SelectedSecurityMode, Converter={StaticResource EqualToVisibilityConverter}, ConverterParameter=None}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="LabelColumn" />
            <ColumnDefinition Width="250" />
        </Grid.ColumnDefinitions>

        <Label Grid.Column="0" Style="{StaticResource LabelDefaultStyle}" Content="{x:Static base:AppStrings.Password}" IsEnabled="False" />
        <wpfControls:TextBoxEx Grid.Column="1" IsEnabled="False" />
    </Grid>
</StackPanel>

切入本质问题。后来看起来像这样:


如您所见,第一列在更改

Visibility
后调整了大小。我想要的是,该列占用最大尺寸标签的空间,而不会在以后将所有可见性设置为
Collapsed
。这也会使 GUI 看起来不稳定。

c# wpf grid sharedsizegroup
© www.soinside.com 2019 - 2024. All rights reserved.