Pregunta

¡WPF GridSplitter hace que mi cuadrícula sea más ancha que mi ventana!

Tengo un WPF Grid con un GridSplitter. Si cambio el tamaño de mis columnas, puedo hacer que mi cuadrícula sea más ancha que mi ventana y no se pueda ver.

Comienza así:

WPF Grid http://img201.imageshack.us/img201/9505/onehg6 .jpg

Pero después de ampliar la columna izquierda, ya no puedo ver la columna derecha (verde):

WPF GridSplitter http://img201.imageshack.us/img201/1804/twomy6 .jpg

¿Qué estoy haciendo mal? ¿Cómo evito que GridSplitter cambie el tamaño de mi Grid?


Actualización:

Todavía estoy luchando con esto. Ahora he intentado anidar cuadrículas dentro de cuadrículas. Eso no ayudó. Aquí están mis XAML ColumnDefinitions, RowDefinitions y GridSplitters ...

<Window ... >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="150" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" MinWidth="400" />
        </Grid.ColumnDefinitions>
        <GridSplitter 
            ResizeDirection="Columns"
            ResizeBehavior="BasedOnAlignment"
            Grid.Column="1"
            HorizontalAlignment="Center"
            VerticalAlignment="Stretch"
            Width="2"
            Margin="0,5,0,5"
            Panel.ZIndex="1"/>
        <Grid Grid.Column="0">
            ...
        </Grid>
        <Grid Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" MinWidth="150" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" MinWidth="200" />
            </Grid.ColumnDefinitions>
            <GridSplitter 
                ResizeDirection="Columns"
                ResizeBehavior="PreviousAndNext"
                Grid.Column="1"
                HorizontalAlignment="Center"
                VerticalAlignment="Stretch"
                Width="2"
                Margin="0,5,0,5"
                Panel.ZIndex="1"/>
            <Grid Grid.Column="0">
                ...
            </Grid>
            <Grid Grid.Column="2">
                ...
            </Grid>
        </Grid>
    </Grid>
</Window>

Actualización:

Creo que el problema es con el control WebBrowser. Ver nueva pregunta:

¿WPF GridSplitter no funciona con el control WebBrowser?

¿Fue útil?

Solución

Si su ventana se redimensiona de modo que su ancho sea menor que la suma de los anchos mínimos de sus columnas, verá las columnas cortadas, pero de lo contrario no puedo reproducir su problema:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="150" Width="*"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition MinWidth="400" Width="*"/>
        </Grid.ColumnDefinitions>
        <GridSplitter
            Width="2"
            Grid.Column="1"
            HorizontalAlignment="Center"
            Margin="0,5,0,5"
            Panel.ZIndex="1"
            VerticalAlignment="Stretch"
            ResizeBehavior="BasedOnAlignment"
            ResizeDirection="Columns"/>
        <Grid Grid.Column="0">
            <Border Background="Red" Margin="5"/>
        </Grid>
        <Grid Grid.Column="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition MinWidth="150" Width="*"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition MinWidth="200" Width="*"/>
            </Grid.ColumnDefinitions>
            <GridSplitter
                Width="2"
                Grid.Column="1"
                HorizontalAlignment="Center"
                Margin="0,5,0,5"
                Panel.ZIndex="1"
                VerticalAlignment="Stretch"
                ResizeBehavior="PreviousAndNext"
                ResizeDirection="Columns"/>
            <Grid Grid.Column="0">
                <Border Background="Green" Margin="5"/>
            </Grid>
            <Grid Grid.Column="2">
                <Border Background="Blue" Margin="5"/>
            </Grid>
        </Grid>
    </Grid>
</Window>

Expandiendo la columna roja, solo se expandirá hasta que la columna derecha alcance su MinWidth de 400, no arrancará desde la página.

Es posible que esté configurando otras propiedades de la ventana o la cuadrícula más externa que causaría este comportamiento ...

Otros consejos

Intente cambiar su ancho a tamaños de estrella. Esto hará que el divisor solo cambie el tamaño de las columnas entre las que se encuentra, por lo que no está seguro de si este es su comportamiento deseado. Sin embargo, con el tamaño de las estrellas, el contenido no crecerá más allá de los límites de la ventana.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" MinWidth="50" />
        <ColumnDefinition Width="2*" MinWidth="100" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="3*" MinWidth="150" />
    </Grid.ColumnDefinitions>
    <GridSplitter 
        ResizeDirection="Columns"
        Grid.Column="1"
        Grid.RowSpan="8"
        HorizontalAlignment="Center"
        VerticalAlignment="Stretch"
        Width="2"
        Margin="0,5,0,5"
        Panel.ZIndex="1"/>
    ...
</Grid>

Funciona para mí sin ningún código adicional cuando no hay columnas con ancho automático entre los divisores, es decir:

<Grid >
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="20*" MinWidth="50" MaxWidth="500" />
    <ColumnDefinition Width="Auto"/> <!-- Remove such columns /-->
    <ColumnDefinition Width="100*" MinWidth="850"/>
    <ColumnDefinition Width="30*" MinWidth="50" MaxWidth="800" />
</Grid.ColumnDefinitions>
...
<GridSplitter HorizontalAlignment="Right" Width="3"/>
...
<GridSplitter Grid.Column="3" HorizontalAlignment="Left" Width="3" />
<!-- Assign Grid.Column to 2 if you remove the auto width column /-->
...
</Grid>

De lo contrario, la cuadrícula será redimensionable.

Capturar el evento DragDelta es otra forma de hacerlo:

private void VerticalGridSplitter_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
{
    if (GridName.ColumnDefinitions[2].Width.Value < 400)
    {
        GridName.ColumnDefinitions[2].Width = new GridLength(400);
    }
}

Pero usar MinWidth en una * ColumnDefinition debería funcionar bien. Tenga en cuenta que ColumnDefinition con MinWidth debe estar en el nivel superior. No funciona si está anidado en alguna cuadrícula dentro de una columna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top