Cuadrícula de WPF: la columna de tamaño automático no se colapsa cuando el contenido Visibilidad se establece en Visibilidad.

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Tengo la siguiente cuadrícula WPf simple, dos columnas, un botón en cada columna, la primera columna de tamaño automático y un divisor para permitir el cambio de tamaño de la columna. Se configura un controlador de eventos en el evento Splitter MouseDoubleclick. Cuando el divisor está doulble, se hace clic en el botón en la columna de la izquierda.

Ahora, ya que la columna 1 tiene un tamaño automático y el contenido está colapsado, esperaría en este punto que la columna 1 debería estar oculta, pero no lo está. A pesar de que su contenido está contraído, el tamaño de la columna no cambia (la columna remeber está en tamaño automático).

Me parece extraño, me gustaría que la columna colapsara, ¿tienes alguna idea de lo que está pasando aquí?

<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;
    }
¿Fue útil?

Solución

Lo que está sucediendo es que cuando redimensionas el ancho / alto de columna / fila con el GridSplitter, establece el valor ActualHeight (o ActualWidth) de la columna / fila.

Debería usar un disparador para establecer la altura de la fila en auto (o cero) cuando su control esté contraído.

Actualízate con esto.

Otros consejos

En mi caso, pude usar StackPanels y configurar el Visibility = " Collapsed " que hizo que se redimensionara correctamente.

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

Es porque el divisor mantiene su posición en la cuadrícula, tira de la primera columna, ¿por qué no intentas un 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top