Come posso impedire a WPF GridSplitter di modificare le dimensioni della mia griglia?

StackOverflow https://stackoverflow.com/questions/279557

  •  07-07-2019
  •  | 
  •  

Domanda

WPF GridSplitter rende la mia griglia più ampia della mia finestra!

Ho una griglia WPF con un GridSplitter. Se ridimensiono le mie colonne, posso rendere la mia griglia più ampia della mia finestra e non visibile.

Inizia così:

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

Ma dopo aver allargato la colonna di sinistra, non riesco più a vedere la colonna di destra (verde):

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

Cosa sto facendo di sbagliato? Come posso impedire a GridSplitter di modificare le dimensioni della mia griglia?


Aggiornamento:

Sto ancora lottando con questo. Ora ho provato a nidificare le griglie all'interno delle griglie. Questo non ha aiutato. Ecco le mie definizioni di colonna, definizioni di righe e griglia di griglia XAML ...

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

Aggiornamento:

Penso che il problema sia con il controllo WebBrowser. Vedi nuova domanda:

WPF GridSplitter non funziona con il controllo WebBrowser?

È stato utile?

Soluzione

Se la tua finestra viene ridimensionata in modo che la sua larghezza sia inferiore alla somma delle minimezze delle colonne, vedrai le colonne tagliate, ma altrimenti non riesco a riprodurre il tuo 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>

Espandendo la colonna rossa, si espanderà solo fino a quando la colonna di destra non raggiunge la sua larghezza minima di 400, non la avvia dalla pagina.

È possibile che tu stia impostando altre proprietà della Finestra o della Griglia più esterna che causerebbe questo comportamento ...

Altri suggerimenti

Prova a modificare le dimensioni della larghezza in stelle. Questo farà sì che lo splitter ridimensioni solo le colonne tra le quali si trova, quindi non sei sicuro se questo è il comportamento desiderato. Tuttavia, con dimensioni delle stelle, il contenuto non aumenterà oltre i limiti della finestra.

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

Funziona per me senza alcun codice aggiuntivo quando non ci sono colonne con larghezza automatica tra i divisori, ovvero:

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

Altrimenti la griglia sarà ridimensionabile.

Catturare l'evento DragDelta è un altro modo di farlo:

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

Ma usare MinWidth su una * ColumnDefinition dovrebbe funzionare bene. Nota che ColumnDefinition con MinWidth deve essere al livello più alto. Non funziona se è nidificato in una griglia all'interno di una colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top