2008-11-10 6 views
5

WPF GridSplitter rend ma grille plus large que ma fenêtre!Comment empêcher le WPF GridSplitter de changer la taille de ma grille?

J'ai une grille WPF avec un GridSplitter. Si je redimensionne mes colonnes, alors je peux rendre ma grille plus large que ma fenêtre et non-visible.

Il commence comme ceci:

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

Mais après l'élargissement de la colonne de gauche, je ne peux plus voir la colonne de droite (vert):

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

Qu'est-ce que je fais faux? Comment empêcher GridSplitter de changer la taille de ma grille?


Mise à jour:

Je me bats toujours avec cela. J'ai maintenant essayé des grilles de nidification dans les grilles. Cela n'a pas aidé. Voici mes XAML ColumnDefinitions, RowDefinitions et 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> 

Mise à jour:

Je pense que le problème est avec le contrôle WebBrowser. Voir nouvelle question:

WPF GridSplitter Doesn't Work With WebBrowser Control?

+0

Votre fenêtre a-t-elle un paramètre MaxWidth? – BrainSlugs83

Répondre

3

Si votre fenêtre est redimensionnée si sa largeur est inférieure à la somme des MinWidths de vos colonnes, vous verrez les colonnes coupées, mais sinon je ne peux pas reproduire votre problème:

<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> 

En développant la colonne rouge, elle ne s'étendra que jusqu'à ce que la colonne de droite atteigne sa valeur minimale de 400. Elle ne démarrera pas la page.

Il est possible que vous configurez d'autres propriétés de la fenêtre ou la grille extérieure qui provoquerait ce comportement ...

+0

Je l'ai eu à travailler en définissant des valeurs MaxWidth arbitrairement élevées pour les colonnes de navigateur non-web comme vous l'avez démontré dans cette autre question: http://stackoverflow.com/questions/375841/wpf-gridsplitter-doesnt-work-with -webbrowser-control # 376480

6

Essayez de changer de largeur à l'étoile tailles. Cela entraînera le diviseur à redimensionner uniquement les colonnes entre lesquelles il se trouve, donc pas sûr si c'est votre comportement souhaité. Cependant, avec les tailles d'étoiles, le contenu ne dépassera pas les limites de la fenêtre.

<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

Cela ne fonctionne pas tout à fait. –

+0

Cela a résolu le problème pour moi. Les colonnes de chaque côté du séparateur devaient être en étoile. –

2

capture l'événement DragDelta est une autre façon de le faire:

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); 
    } 
} 

Mais en utilisant MinWidth sur un * ColumnDefinition devrait fonctionner correctement. Notez que la ColumnDefinition avec MinWidth doit être au niveau supérieur. Il ne fonctionne pas s'il est imbriqué dans une grille à l'intérieur d'une colonne.

3

Il fonctionne pour moi sans code supplémentaire quand il n'y a pas de colonnes avec Largeur automatique entre les splitters, i.e. .:

<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> 

Sinon, la grille de départ sera redimensionnable.

Questions connexes