Столбец сетки с sharedsizegroup не 'восстанавливает' размер, когда он свернут или невидим - PullRequest
3 голосов
/ 02 апреля 2012

У меня есть следующий 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 ]

2 голосов
/ 01 ноября 2017

У меня была такая же проблема, но со строками вместо столбцов. В конце концов я победил его с помощью пользовательского конвертера привязки 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>
0 голосов
/ 02 апреля 2012

Насколько я знаю, ширина = "Авто" не обязательно обновляет ширину при изменении элементов.

Я считаю, что то, что я делал в прошлом, это установил width = Double.NaN (или установил width = его собственную фактическую ширину, а затем установил double.NaN) согласно этому сообщению,

Я полагаю, что кто-то нашел этот код, используя отражение на двойном щелчке границы столбца, так что это то, что Microsoft делает внутренне для изменения размера столбцов

Вы можете реализовать нечто похожее на этот пост с сетками вместо представления. Вы также можете прямо указать это в событии click переключателя (это также хорошо для MVVM, поскольку код создает поведение исключительно для пользовательского интерфейса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...