2013-05-31 16 views
6

Ho appena iniziato a sperimentare i gridsplitters e sono incappato in un comportamento molto strano e non riesco a risolverlo. Apparentemente gli altri hanno problemi simili (secondo google), ma non ci sono stati commenti utili.Gridsplitter: limita le altezze delle file alle dimensioni della finestra

Ho una griglia con 2 righe. All'avvio, quello in basso ha uno Hight di 250. La riga superiore prende il resto con *. Quando ridimensiono le righe con lo splitter, il comportamento è come previsto per la riga superiore. Ma quando trascino lo splitter verso l'alto e oltre la finestra del programma, il contenuto della riga in basso uscirà dalla finestra (= sposta verso il basso fino a quando non è sparito). Mi aspetto che non possa rendere ogni riga più grande del contenitore genitore.

<Grid x:Name="grid_main" ScrollViewer.VerticalScrollBarVisibility="Disabled" > 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition MinHeight="250" Height="250"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <GridSplitter x:Name="splitter" 
     ResizeDirection="Rows" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Width="Auto" 
     Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Margin="0" ResizeBehavior="BasedOnAlignment" /> 
    <Grid Grid.Column="0" Grid.Row="0"> 
    </Grid> 
    <Grid Grid.Column="0" Grid.Row="1">    
    </Grid> 
</Grid> 

Questo è il mio codice. Il contenuto di entrambe le righe è nuovamente ospitato nelle griglie ed è stato rimosso per semplicità. Ancora: il ridimensionamento per la riga superiore funziona correttamente. Ma la riga inferiore può essere ridimensionata all'infinito. Funziona come previsto se indico un codice fisso a MaxHeight. Ma questo deve dipendere dalle dimensioni della finestra.

risposta

4

Provare a cambiare la vostra seconda RowDefinition al seguente:

<RowDefinition MinHeight="250" MaxHeight="{Binding ElementName=grid_main, Path=ActualHeight}" Height="250"/> 

Questo farà in modo che l'altezza della riga non supererà le dimensioni della finestra.

+0

Grazie per la risposta. Che funzioni. Ma implementare un 'MinHeight' per la fila in alto si rivela ... difficile ... Quando si ha a che fare con WPF, di solito lo maledicono e ad un certo punto ho una soluzione davvero elegante che mi fa pensare" Wow , WPF è davvero fantastico, dopo tutto ". Non sono sicuro che raggiungerò questo punto su questo argomento ... – Jan

+0

So cosa intendi, mi sento allo stesso modo un sacco di tempo. C'è una soluzione per definire un MinHeight per la riga superiore, che sia elegante o meno discutibile! Se si utilizza un MultiValueConverter, è possibile passare a ActualHeight of the Grid come prima e la riga in alto MinHeight e restituire la differenza. Usa questo valore come altezza massima sulla seconda riga. –

+0

Ho usato un 'IValueConverter' per applicare l'offset. – Peter

0

La soluzione di Richard non ha funzionato per me (l'altezza effettiva della griglia si espandeva oltre le dimensioni della finestra insieme all'altezza della riga).

Utilizzando Snoop, ho rilevato che l'altezza effettiva di un antenato ContentPresenter non era in aumento. Quindi la seguente definizione di riga inferiore ha funzionato per me, anche se continuavo a riscontrare problemi se ho impostato MinHeight sulle righe in alto o in basso:

<RowDefinition Height="430" 
       MaxHeight="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=ActualHeight}"/>