2016-05-04 2 views
6

Я пытаюсь скрыть столбец в Grid с GridSplitter при нажатии кнопки (кнопка устанавливает видимость всех элементов в третьем столбце для свертывания) , Если я не перемещаю GridSplitter, он работает правильно, а третий столбец исчезает, но если я перемещаю GridSplitter, содержимое исчезает, а остальные столбцы не изменяются, чтобы заполнить пустое пространство.WPF - Столбцы не скрываются должным образом при перемещении 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.

+0

Покажите, как именно вы * шкура * что-то? Использование 'x: Name' уже не является чистым MVVM (я предполагаю, что вы устанавливаете ширину определения столбца в коде позади). Кстати, вы можете использовать [ScreenToGif] (https://screentogif.codeplex.com/) и фиксировать несколько кадров для демонстрации проблемы, см. [Мой вопрос] (http://stackoverflow.com/q/36915180/1997232). – Sinatr

+0

Я добавил gif, до сих пор я сделал решение, используя код позади. я хотел бы знать, есть ли способ решить эту проблему, не используя код за – Jacopo

ответ

4

Проблема проста, вы установите GridSplitter ResizeBehavior="PreviousAndCurrent", но предыдущая ширину столбца сетки * и, как только вы перемещаете сплиттер ширина его единицы будет изменена на абсолютный (так что он не будет иметь возможности изменить размер, когда 3d ширина столбца изменяется).

Просто установите GridSplitter ResizeBehavior="PreviousAndNext", чтобы решить эту проблему. Если вы сделаете так, сплиттер изменит ширину 3d-столбца, но больше не должен касаться первого.

Btw, а с помощью кнопки и нажмите событие, которое вы можете использовать ToggleButton (который IsChecked обязан Visibility контейнера с содержанием вы хотите скрыть), см this answer. Использование преобразователей с чистым представлением 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> 

Нет необходимости кода позади, получить конвертер от here.

Пойнт: 1) ставить разделитель внутри прятки в состоянии контейнер колонок 2) установки сетки иметь * и fixed width (сплиттер doesn't work well с auto столбцов).

Демо:

+0

. Я установил ResizeBehavior в PreviousAndNext, но это не решает проблему. кажется, что ширина 3-го столбца изменяется с Auto на значение, и это значение сохраняется, даже если значение Visibility установлено на Collapsed. Я пробовал другие ResizeBehavior, но ничего не работает. – Jacopo

+0

Правильно, см. Править. – Sinatr

+0

это работает, спасибо! – Jacopo

Смежные вопросы