WPF Grid - La colonne de taille automatique ne se réduit pas lorsque Visibility du contenu est défini sur Visibility.Collapsed

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

  •  05-07-2019
  •  | 
  •  

Question

J'ai la grille WPf simplifiée suivante, deux colonnes, un bouton dans chaque colonne, la première colonne dimensionnée automatiquement et un séparateur permettant le redimensionnement des colonnes. Un gestionnaire d'événements est configuré sur l'événement splitter MouseDoubleclick. Lorsque vous cliquez sur le séparateur, le bouton de la colonne de gauche est réduit.

Maintenant, comme la colonne 1 est automatiquement dimensionnée et que le contenu est réduit, je m'attendrais maintenant à ce que la colonne 1 soit effectivement masquée, mais ce n'est pas le cas. Bien que son contenu soit réduit, la taille de la colonne ne change pas (la colonne de mémoire est redimensionnée automatiquement).

Cela me semble étrange, j'aimerais que la colonne s'effondre - une idée de ce qui se passe ici?

<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;
    }
Était-ce utile?

La solution

En réalité, lorsque vous redimensionnez la largeur / hauteur de la colonne / ligne avec GridSplitter, vous définissez la hauteur réelle (ou la largeur réelle) de la colonne / ligne.

Vous devez utiliser un déclencheur pour définir la hauteur de la ligne sur auto (ou zéro) lorsque votre contrôle est réduit.

Informez-moi de ceci.

Autres conseils

Dans mon cas, j’ai pu utiliser StackPanels et définir le Visibility = "Collapsed" , ce qui l’a fait redimensionner correctement.

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

C'est parce que le séparateur garde sa position dans la grille, il tire la première colonne, pourquoi ne pas essayer un expandeur?

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top