2008-11-10 17 views
5

¡WPF GridSplitter hace que mi cuadrícula sea más ancha que mi ventana!¿Cómo evito que el WPF GridSplitter cambie el tamaño de mi cuadrícula?

Tengo una cuadrícula WPF 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 visible.

Se comienza así:

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

Pero después de la ampliación de 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 ¿incorrecto? ¿Cómo evito que GridSplitter cambie el tamaño de mi cuadrícula?


Actualización:

todavía estoy luchando con esto. Ahora he intentado anidar cuadrículas dentro de las cuadrículas. Eso no ayudó. Aquí está mi ColumnDefinitions XAML, 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 del control WebBrowser. Ver nueva pregunta:

WPF GridSplitter Doesn't Work With WebBrowser Control?

+0

¿Su ventana tiene un conjunto MaxWidth? – BrainSlugs83

Respuesta

3

si la ventana se cambia el tamaño por lo que su anchura es menor que la suma de sus columnas MinWidths, verá las columnas cortadas, pero de lo contrario no se puede reproducir el 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és establecer otras propiedades de la ventana o de la red externa que podría causar este comportamiento ...

+0

Lo hice funcionar estableciendo valores de MaxWidth arbitrariamente altos para las columnas que no son del navegador web como lo demostró en esta otra pregunta: http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with -webbrowser-control # 376480

6

trate de cambiar su anchura a la estrella de tamaños. 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> 
+0

Esto no funciona del todo. –

+0

Esto resolvió el problema para mí. Las columnas a cada lado del divisor tenían que ser del tamaño de una estrella. –

2

Capturar el evento DragDelta es otra manera 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 el uso de 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.

3

Funciona para mí sin ningún código adicional cuando no hay columnas con Auto Anchura 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> 

lo contrario, la cuadrícula se puede cambiar de tamaño.

Cuestiones relacionadas