WPF-столбцы не скрываются должным образом при перемещении GridSplitter
Я пытаюсь скрыть столбец в Grid
С GridSplitter
при нажатии кнопки (кнопка устанавливает видимость всех элементов в третьем столбце развалился). Если я не сдвину GridSplitter
он работает правильно, и третий столбец исчезает, но если я перемещу GridSplitter
содержимое исчезает, но другие столбцы не изменяют размер, чтобы заполнить пустое пространство.
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="a" Width="*"/>
<ColumnDefinition x:Name="b" Width="3"/>
<ColumnDefinition x:Name="c" Width="Auto" MaxWidth="600"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Grid.Row="0" HorizontalAlignment="Stretch" Background="Green">
<Image Source="te/Dante.png" Height="Auto" Margin="0,128,2,71"/>
</Border>
<Button Grid.Column="0" Grid.Row="0" Width="30" Height="30" Margin="0,10,10,0" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Button_Click"></Button>
<GridSplitter Width="5" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" ResizeDirection="Columns" HorizontalAlignment="Left" Background="White" BorderBrush="Black" BorderThickness="1,0" ResizeBehavior="PreviousAndCurrent"/>
<WrapPanel x:Name="wpC" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" MinWidth="300" HorizontalAlignment="Stretch" Background="Aqua" Panel.ZIndex="-1"></WrapPanel>
</Grid>
вот пример моей проблемы (gif):
как могу ли я решить эту проблему? Возможно, соблюдая шаблон MVVM.
1 ответов
проблема проста, вы устанавливаете GridSplitter ResizeBehavior="PreviousAndCurrent"
, но предыдущая ширина столбца сетки -*
и как только вы переместите разделитель, его единицы ширины будут изменены на абсолютные (поэтому он не сможет изменять размер при изменении ширины 3D-столбца).
просто набор GridSplitter ResizeBehavior="PreviousAndNext"
для решения проблемы. Если вы это сделаете, разделитель изменит ширину 3D-столбца, но больше не должен касаться первого.
Кстати, вместо использования кнопки и нажмите событие, которое вы можете использовать ToggleButton
(который IsChecked
обязан Visibility
контейнера с содержимым, которое вы хотите скрыть), см. ответ. Использование конвертеров с чистым представлением xaml лучше MVVM, чем с некоторым кодом позади и x:Name
.
правильно, у вас есть несколько проблем с макетом, вот полное решение:
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border Background="Green" />
<ToggleButton x:Name="toggleButton"
Width="30"
Height="30"
Margin="0,10,10,0"
HorizontalAlignment="Right"
VerticalAlignment="Top" />
<Grid Grid.Column="1"
Visibility="{Binding IsChecked, ElementName=toggleButton, Converter={StaticResource BooleanToVisibilityConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="300"
MinWidth="300"
MaxWidth="600" />
</Grid.ColumnDefinitions>
<GridSplitter Width="5"
ResizeBehavior="CurrentAndNext" />
<WrapPanel Grid.Column="1"
Background="Aqua" />
</Grid>
</Grid>
нет необходимости в коде-за, получить конвертер из здесь.
точки: 1) Поставить сплиттер внутри скрываются в состоянии контейнера 2) Настройка столбцов иметь *
и fixed width
(splitter не работает С auto
столбцы).
демо: