WPF Grid - coluna tamanho Auto não desmoronar quando o conteúdo Visibilidade conjunto para Visibility.Collapsed

StackOverflow https://stackoverflow.com/questions/1601171

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu tenho a grade WPF seguinte simpl, duas colunas, um botão em cada coluna, o primeiro auto coluna size e um divisor para permitir o redimensionamento da coluna. Um manipulador de eventos está configurado no divisor MouseDoubleClick evento. Quando o divisor é doulble clicou no botão na coluna da esquerda é recolhido.

Agora, como a coluna 1 é auto tamanho eo conteúdo é recolhido eu esperaria neste ponto que a coluna 1 deve efetivamente ser escondido, no entanto, não é. Embora seu conteúdo é recolhido o tamanho da coluna não muda (coluna remeber é autosized).

Parece estranho para mim, eu gostaria a coluna ao colapso -? Alguma idéia do que está acontecendo aqui

<Window x:Class="KingLayout.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <Button x:Name="leftButton">Left</Button>
        <Button Grid.Column="1" Margin="5,0,0,0">Right</Button>
        <GridSplitter Name="verticalSplitter" ShowsPreview="True" Grid.RowSpan="1" Grid.Column="1" HorizontalAlignment="Left"
                      VerticalAlignment="Stretch" Width="5" MouseDoubleClick="verticalSplitter_MouseDoubleClick"/>
    </Grid>
</Window>


    private void verticalSplitter_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        leftButton.Visibility = leftButton.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }
Foi útil?

Solução

O que está acontecendo é que quando você redimensionar a coluna / linha largura / altura com o GridSplitter, ele define o ActualHeight (ou ActualWidth) da coluna / linha.

Você deve usar um gatilho para a altura da linha definida como Auto (ou zero) quando o controle é recolhido.

Get me atualizado com isso.

Outras dicas

No meu caso, eu era capaz de usar StackPanels e definindo o Visibility="Collapsed" que causou-lo para redimensionar corretamente.

<StackPanel Orientation="Vertical" Margin="5">
    <StackPanel Orientation="Horizontal">
      <!-- Some controls -->
    </StackPanel>
    <StackPanel Orientation="Horizontal" Visibility="{Binding YourVisibilityProperty}">
      <!-- Some controls -->
    </StackPanel>
</StackPanel>

É porque o divisor mantém a sua posição no grid, ele puxa a primeira coluna, por que não tentar um expansor?

<Grid ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <Expander ExpandDirection="Left">
        <Button x:Name="leftButton">Left</Button>
    </Expander>
    <Button Grid.Column="1" Margin="5,0,0,0">Right</Button>
</Grid>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top