Panel.Dock Fill ignorando altre impostazioni Panel.Dock


154

Se si crea un pannello su un modulo e lo si imposta su Dock = Top e si rilascia un altro pannello e si imposta Dock = Fill, è possibile riempire l'intero modulo, ignorando il primo pannello. La modifica dell'ordine delle schede non fa nulla.

Risposte:


335

Il layout di docking dipende dall'ordine dei controlli di pari livello. I controlli sono ancorati "button up", quindi l'ultimo controllo della raccolta viene ancorato per primo . Un controllo ancorato tiene conto solo del layout dei fratelli precedentemente ancorati. Quindi il controllo con Dock = Fill dovrebbe essere il primo (in alto) nell'ordine dei fratelli, se si desidera che tenga conto degli altri controlli ancorati. Se non è il primo controllo, i controlli precedenti lo sovrapporranno.

Questo può essere fonte di confusione perché l'ordine dei fratelli non è necessariamente lo stesso dell'ordine visivo e l'ordine dei fratelli non è sempre evidente dalla vista del design.

La finestra Struttura del documento (Visualizza -> Altre finestre -> Struttura del documento) offre una vista ad albero utile sulla gerarchia e sull'ordine dei controlli e consente di modificare l'ordine dei controlli tra fratelli.

Puoi anche cambiare l'ordine dei fratelli direttamente nel designer dal menu contestuale -> Porta in primo piano / Invia in secondo piano, che sposta il controllo in modo che sia il primo o l'ultimo dei fratelli. Queste etichette di menu possono essere un po 'confuse poiché l'effetto reale dipende dal modello di layout.

Con i controlli posizionati fissi, la posizione 2D è indipendente dall'ordine dei fratelli, ma quando i controlli si sovrappongono, il primo controllo nell'ordine sarà "in alto", nascondendo parte dei fratelli più avanti nell'ordine. In questo contesto Porta in primo piano / Invia in secondo piano ha senso.

All'interno dei pannelli di layout di flusso o tabella, l'ordine di creazione determina l'ordine visivo dei controlli. Non ci sono controlli sovrapposti. Quindi portare in primo piano / inviare in secondo piano significa davvero fare il primo o l'ultimo nell'ordine dei controlli.

Con il layout ancorato, portare in primo piano / inviare in secondo piano può essere ancora più confuso poiché determina in quale ordine viene calcolato il docking, quindi "portare in primo piano" su un controllo riempito con docking posizionerà il controllo nel mezzo del genitore , tenendo conto di tutti i controlli ancorati ai margini.


1
ho un pannello, una striscia di stato e una striscia di menu su un modulo e sembra che quando aggancio la striscia di menu in alto, la striscia di stato in basso e riempio il pannello, il pannello non riempie lo spazio tra il due strisce a meno che non sia il primo fratello (nella parte superiore della finestra Struttura documento sopra le due strisce). Spostando il pannello verso il basso (verso "ultimo") si coprono le strisce. Quindi il controllo Dock = Fill dovrebbe effettivamente essere il primo fratello dell'ordine? Sto leggendo questo male? sto usando 3.5 (2008). Questo è cambiato?
jrsconfitto,

53
tl; dr; Fare clic con il tasto destro sul pannello con Dock = Fill e fare clic su "Porta in primo piano".
kristianp,

20
+1 per la finestra Struttura documento. Non ho mai saputo che esistesse, eppure è così utile.
Gligoran,

2
Come posso farlo programmaticamente? Voglio dire, sto aggiungendo i controlli in modo dinamico, quindi non posso usare il designer per farlo.
Camilo Martin

2
@Camilo: se aggiungi controlli in modo dinamico, dovresti aggiungerli nell'ordine desiderato.
Jacques B

110

Fare clic con il tasto destro sul pannello con Dock = Fill e fare clic su "Porta in primo piano".

Questo rende l'ultimo controllo creato, che tiene conto delle impostazioni del Dock su altri controlli nello stesso contenitore.


1
Semplicemente, manna dal cielo, questo mi aveva davvero infastidito
smirkingman,

Ha senso una volta che ci pensi.
Gary Kindel,

7

Un'altra opzione potenzialmente più pulita consiste nell'utilizzare il controllo TableLayout. Imposta una riga dell'altezza desiderata per il tuo dock superiore e un'altra riga per riempire il 100% per il tuo bottom. Impostare entrambi i pannelli all'interno su Riempi e il gioco è fatto.

(TableLayout richiede un po 'di tempo per abituarsi).


1
TableLayout è anche più lento dei dockter di aggancio per le prestazioni del layout, in particolare se hai controlli utente nidificati che utilizzano TableLayout. Tuttavia, rende sicuro un layout piacevole.
Nick,

1
Questa prestazione colpisce qualcosa che un utente medio vedrebbe in un semplice caso di due pannelli, come descritto sopra? O è qualcosa che notano quando hai dozzine di UC, tutti con layout, tutti in un layout? (Ironia della sorte, l'app su cui sto attualmente lavorando è così, e le prestazioni sembrano OK ...)
John Rudy,

TableLayout è piuttosto leggero. Non vedrai problemi di prestazioni se stai solo disponendo alcuni controlli.
Tim

7

Ho avuto lo stesso problema e sono riuscito a risolverlo.
Se hai un container con DockStyle.Fillgli altri, dovresti avere anche DockStyle ma Top o quello che vuoi.
L'importante è aggiungere il controllo DockStyle.Fillprima con Controlli e poi con gli altri.

Esempio:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

ma se mettiamo prima cb

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

Se non si desidera modificare l'ordine degli elementi all'interno del codice, è possibile utilizzare il metodo Container.Controls.SetChildIndex () con Container come Modulo, Pannello, ecc. A cui si desidera aggiungere i controlli.

Esempio:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;

1

JacquesB ha avuto l'idea con la struttura del documento ma la gerarchia non ha risolto il mio problema. I miei controlli non erano in uno stile gerarchico, ma erano elencati con lo stesso genitore.

Ho imparato che se hai cambiato l'ordine, risolverà l'aspetto che desideri.

I controlli in fondo all'elenco si sovrapporranno ai controlli al di sopra di esso nella finestra Struttura documento. Nel tuo caso ti assicureresti che il primo pannello sia sotto il secondo pannello e così via.


0

Ecco un trucco che ha funzionato per me ..

Posiziona l'elemento principale e aggancialo in alto.

Posiziona uno splitter e anche aggancialo in alto, quindi impostalo disabilitato (a meno che non desideri ridimensionare la parte superiore).

Quindi posizionare l'oggetto Fill e impostare Docking su Fill. L'oggetto rimarrà sotto lo splitter.


0

Ho riscontrato lo stesso problema. Il mio era con l'aggiunta di controlli nuovi / personalizzati sotto la barra dei menu durante il runtime. Il problema era che i controlli quando erano ancorati, decisero di agganciarsi dalla cima del modulo e ignorando completamente la striscia di menu, molto fastidioso se me lo chiedessi. Dato che questo doveva essere fatto dinamicamente con il codice e non durante la modalità di progettazione, questo è diventato estremamente frustrante. Il modo più semplice che ho trovato è creare un pannello durante la modalità di progettazione e agganciarlo sotto la barra dei menu. Da lì puoi semplicemente aggiungere / rimuovere i controlli al pannello e puoi agganciarlo durante il runtime. Non c'è bisogno di pasticciare con tutti i controlli sul modulo che non hanno davvero bisogno di cambiare, troppo lavoro a seconda di ciò che è davvero necessario fare.

object.dock = Fill
Panel.Controls.Add(object)

0

So che questo è un vecchio post ma ho scoperto qualcosa di utile. Per regolare l'ordine di controllo dei fratelli in modo programmatico per i controlli creati dinamicamente, puoi fare qualcosa del tipo:

parentForm.Controls.SetChildIndex (myPanel, 0) 

Nel mio caso, l'ho fatto per spostare un pannello Dock / Fill come primo controllo nel mio modulo in modo che non si sovrapponesse con un altro controllo dock impostato su Dock / Top (una barra dei menu).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.