Come posso impedire a WPF GridSplitter di modificare le dimensioni della mia griglia?
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:
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.