.net - ¿Cómo evito que WPF GridSplitter modifique el tamaño de mi cuadrícula?
wpf grid splitter (4)
¡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, entonces puedo hacer que mi cuadrícula sea más ancha que mi ventana y no visible.
Comienza así:
Rejilla WPF http://img201.imageshack.us/img201/9505/onehg6.jpg
Pero después de ampliar la columna de la izquierda, ya no puedo ver la columna de la 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 cuadrícula?
Actualizar:
Todavía estoy luchando con esto. Ahora he intentado anidar cuadrículas dentro de las cuadrículas. Eso no ayudó. Aquí está mi 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>
Actualizar:
Creo que el problema es con el control WebBrowser. Ver nueva pregunta:
Intente cambiar su ancho a tamaños de estrellas. 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 tamaños de estrella, 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>
Si su Ventana se redimensiona para que su Ancho sea menor que la suma de MinWidths de sus columnas, verá que las columnas están 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>
Al expandir la columna roja, solo se expandirá hasta que la columna de la derecha alcance su MinWidth de 400, no la arrancará de 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 ...
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 * 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 grilla dentro de una columna.
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.