具有sharedsizegroup的网格列在折叠或不可见时不会'回收'大小

时间:2012-04-02 13:25:58

标签: wpf xaml

我有以下xaml:

<Window x:Class="SharedSizeGroupBug.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">
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>

<StackPanel Grid.IsSharedSizeScope="True">
    <ToggleButton IsChecked="False" Name="TB" Content="Toggle" />

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="DZG" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="A1" Width="100" />
        <TextBlock Text="A2" Grid.Column="1" />
    </Grid>

    <Grid Visibility="{Binding IsChecked, ElementName=TB, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="DZG" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>

        <TextBlock Text="B1" Width="200" />
        <TextBlock Text="B2" Grid.Column="1" />
    </Grid>
</StackPanel>
</Window>

尝试此操作时,第一列的初始状态为 100 宽。按下按钮并使第二个网格可见时,第一列的宽度为 200 。但是,当您再次按下该按钮时,该列仍将 200 宽。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但是使用Rows而不是列。我最终用一个自定义的ivalue绑定转换器击败了它,基本上根据绑定的可见性剥离/恢复共享大小的组。

这是转换器:

class VisibilityToSharedSizeGroupConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (((System.Windows.Visibility)value) == System.Windows.Visibility.Visible) ? parameter : string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return System.Windows.Data.Binding.DoNothing;
    }
}

这是一个XAML示例:

<Window.Resources>
    <local:VisibilityToSharedSizeGroupConverter x:Key="VisToShared" />
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" 
                       SharedSizeGroup="{Binding Converter={StaticResource ResourceKey=VisToShared}, ConverterParameter='LabelsGroup', ElementName=MyLabel1, Path=Visibility}"/>
        </RowDefinition>
    </Grid.RowDefinitions>
</Grid>

答案 1 :(得分:0)

据我所知,宽度=&#34;自动&#34;当项目发生变化时,不一定会更新宽度。

我相信我过去所做的是设置width = Double.NaN(或设置width =自己的实际宽度,然后将其设置为double.NaN)as per this post

我相信有人通过双击列边框使用反射来找到此代码,因此这实际上是微软在内部调整列的大小

您可以使用网格而不是视图实现类似于该帖子的内容。你也可以直接把它放在切换的点击事件中(这对MVVM来说也很好,因为代码只为用户界面创建行为)