Question

WPF GridSplitter élargit ma grille par rapport à ma fenêtre!

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

Cela commence comme ceci:

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

Mais après avoir élargi 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 mal? Comment empêcher le GridSplitter de changer la taille de ma grille?

Mise à jour:

Je me bats toujours avec ça. J'ai maintenant essayé les grilles de nidification dans les grilles. Cela n'a pas aidé. Voici mes colonnes 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 vient du contrôle WebBrowser. Voir la nouvelle question:

Le séparateur de grille WPF ne fonctionne pas avec le contrôle WebBrowser?

Était-ce utile?

La solution

Si votre fenêtre est redimensionnée de sorte que sa largeur soit inférieure à la somme des largeurs minimales 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>

Si vous agrandissez la colonne rouge, elle ne se développera que jusqu'à ce que la colonne de droite atteigne sa largeur minimale de 400, elle ne l'initialisera pas à partir de la page.

Il est possible que vous définissiez d'autres propriétés de la fenêtre ou de la grille la plus externe susceptibles de provoquer ce comportement ...

Autres conseils

Essayez de changer votre largeur en tailles étoiles. Cela fera en sorte que le séparateur ne redimensionne que les colonnes entre lesquelles il se trouve, vous ne pouvez donc pas savoir s'il s'agit de votre comportement souhaité. Toutefois, 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>

Cela fonctionne pour moi sans code supplémentaire lorsqu'il n'y a pas de colonnes avec largeur automatique entre les séparateurs, c'est-à-dire:

<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 sera redimensionnable.

Capturer 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 utiliser MinWidth sur une * ColumnDefinition devrait bien fonctionner. Notez que ColumnDefinition avec MinWidth doit être au niveau supérieur. Cela ne fonctionne pas s'il est imbriqué dans une grille à l'intérieur d'une colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top