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.
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:
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.
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.
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).
Ho avuto lo stesso problema e sono riuscito a risolverlo.
Se hai un container con DockStyle.Fill
gli altri, dovresti avere anche DockStyle ma Top o quello che vuoi.
L'importante è aggiungere il controllo DockStyle.Fill
prima 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.
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;
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.
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.
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)
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).