Domanda

Alcuni controlli WPF (come il Button) sembrano consumare allegramente tutto lo spazio disponibile nel suo contenitore se non si specifica l'altezza che deve avere.

E alcuni, come quelli che devo usare adesso, il (multilinea) TextBox e il ListBox sembrano più preoccupati di occupare solo lo spazio necessario per adattare il loro contenuto, e niente di più.

Se metti questi ragazzi in una cella in a UniformGrid, si espanderanno per adattarsi allo spazio disponibile.Tuttavia, UniformGrid le istanze non sono adatte a tutte le situazioni.Cosa succede se hai una griglia con alcune righe impostate su un'altezza * per dividere l'altezza tra se stessa e le altre * righe?E se hai un StackPanel e hai un Label, UN Liste un Button, come è possibile fare in modo che l'elenco occupi tutto lo spazio non occupato dall'etichetta e dal pulsante?

Penserei che questo sarebbe davvero un requisito di layout di base, ma non riesco a capire come farli riempire lo spazio che potrebbero (mettendoli in un DockPanel e anche impostarlo su riempimento non funziona, a quanto pare, dal momento che il file DockPanel occupa solo lo spazio necessario ai suoi sottocontrolli).

Una GUI ridimensionabile sarebbe piuttosto orribile se dovessi giocarci Height, Width, MinHeight, MinWidth eccetera.

Puoi legare il tuo Height E Width proprietà nella cella della griglia che occupi?O c'è un altro modo per farlo?

È stato utile?

Soluzione

Ogni controllo derivante da Panel implementa una logica di layout distinta eseguita in Measure() E Arrange():

  • Measure() determina la dimensione del pannello e di ciascuno dei suoi figli
  • Arrange() determina il rettangolo in cui viene eseguito il rendering di ciascun controllo

L'ultimo figlio del DockPanel riempie lo spazio rimanente.È possibile disattivare questo comportamento impostando il file LastChild proprietà a false.

IL StackPanel chiede a ogni bambino la dimensione desiderata e poi li impila.Il pannello dello stack chiama Measure() su ogni bambino, con una taglia disponibile di Infinity e poi utilizza la taglia desiderata dal bambino.

UN Grid occupa tutto lo spazio disponibile, tuttavia imposterà ogni bambino alla dimensione desiderata e poi lo centrerà nella cella.

Puoi implementare la tua logica di layout derivando da Panel e quindi sovrascrivere MeasureOverride() E ArrangeOverride().

Vedere Questo articolo per un semplice esempio.

Altri suggerimenti

Esistono anche alcune proprietà che puoi impostare per forzare un controllo a riempire lo spazio disponibile quando altrimenti non lo farebbe.Ad esempio, puoi dire:

HorizontalContentAlignment="Stretch"

...per forzare il contenuto di un controllo ad allungarsi orizzontalmente.Oppure puoi dire:

HorizontalAlignment="Stretch"

...per forzare il controllo stesso ad allungarsi orizzontalmente per riempire il suo genitore.

Beh, l'ho capito da solo, subito dopo aver pubblicato, che è il modo più imbarazzante.:)

Sembra che ogni membro di StackPanel riempirà semplicemente la dimensione minima richiesta.

Nel DockPanel avevo ancorato le cose nell'ordine sbagliato.Se TextBox o ListBox è l'unico elemento ancorato senza allineamento, o se sono gli ultimi aggiunti, riempiranno lo spazio rimanente come desiderato.

Mi piacerebbe vedere un metodo più elegante per gestire la situazione, ma andrà bene.

Usa il Allineamento orizzontale E Allineamento verticale proprietà del layout.Controllano il modo in cui un elemento utilizza lo spazio che ha all'interno del suo genitore quando è disponibile più spazio di quello richiesto dall'elemento.

La larghezza di StackPanel, ad esempio, sarà pari all'elemento più largo che contiene.Quindi, tutti gli elementi più stretti hanno un po’ di spazio in eccesso.Le proprietà di allineamento controllano cosa fa l'elemento figlio con lo spazio extra.

Il valore predefinito per entrambe le proprietà è Stretch, quindi l'elemento figlio viene allungato per riempire tutto lo spazio disponibile.Ulteriori opzioni includono Sinistra, Centro e Destra per Allineamento orizzontale e Alto, Centro e Basso per Allineamento verticale.

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