2014-11-09 7 views
8

Quindi ho 3 contenitori divisi, con 2 pannelli ciascuno.Nested SplitContainers bug the SplitterWidth

SplitContainer1 è il contenitore principale ancorato nel modulo (padre).

SplitContainer1.Panel1 contiene SplitContainer2 che è ancorato.

SplitContainer1.Panel2 contiene SpliContainer3 che è ancorato.

Fin qui tutto bene.

SplitContainer1 ha una SplitterWidth di 3. SplitContainer2 e SplitContainer3 ha un SplitterWidth di 6.

Nella finestra di progettazione, si può vedere la differenza SplitterWidth tra di loro, ma quando ho costruire la soluzione, la SplitterWidth di SplitContainer2 e SplitContainer3 viene reimpostato su 4 indipendentemente da ciò che faccio. Ho modificato il codice in "InitializeComponent" del modulo senza alcun effetto.

L'unico modo in cui ho ottenuto questo funzionamento è nello Load Event del modulo, specificare nuovamente il SplitterWidths che trovo completamente stupido. Perché lo SplitterWidths non si posizionerà al valore specificato in Designer?

Se qualcuno può far luce su questo, cosa sarebbe fantastico !!

Grazie per il vostro tempo,

Peter

+0

Sono stato in grado di riprodurre il problema sulla mia estremità. Ovviamente non dovrebbe funzionare in questo modo. Sembra un bug nel modo in cui la proprietà ambient di SplitContainer1 viene copiata negli altri due? Poiché si tratta di un bug, non c'è soluzione alternativa tranne l'approccio "stupido" che hai già capito. Scusa amico. –

+7

Sì, questo è un bug. Una sfortunata interazione tra l'implementazione ISupportInitialize utilizzata da SplitContainer, che ritarda l'assegnazione delle proprietà effettive. E il calcolo del layout per il pannello, che impone la larghezza dello splitter da assegnare. Con il suo vecchio valore, non il nuovo valore in sospeso. La soluzione alternativa è abbastanza semplice, basta assegnare le proprietà nel costruttore del modulo, dopo la chiamata InitializeComponent(). –

+1

@HansPassant - Hans, in base alla tua esperienza, pensi che questi bug abbiano qualche possibilità di essere risolti? Ho presentato [simile] (https://connect.microsoft.com/VisualStudio/feedback/details/796965/menustrip-right-left-arrow-keys-work-reversely-when-a-submenu-is-open-dropped -down) ed è stato rifiutato. I ragazzi di .NET generalmente hanno paura di rompere la compatibilità con queste correzioni? Devo continuare a segnalarli o devo rinunciarvi? – miroxlav

risposta

0

solo in modo che questo non è lasciata senza risposta per l'eternità -

Questo è un vecchio bug che è stato in Visual Basic per molte versioni ora, e non viene mai affrontato (né è probabile che sia mai indirizzato).

Come menziona Hans Passant, il problema è dovuto all'implementazione ISupportInitialize per SplitContainer.

Poiché si tratta di un bug, non esiste un modo definitivo di risolvere il problema che abbia un senso logico.

Un modo, che ho provato in un programma di simulazione, è come dice @xfx: aggiungere e manipolare i controlli a livello di codice, anziché utilizzare la casella degli strumenti.

Un'alternativa è quella di ricaricare lo SplitterWidths in modo programmatico, sia su , che è più probabile, sia su qualsiasi altra parte del codice che potrebbe essere richiesto.

0

Non penso che sia un bug.

Quando un controllo contenitore è nidificato in un altro controllo contenitore nella finestra di progettazione, il controllo nidificato deve essere il primo controllo trascinato dalla casella degli strumenti in un modulo.

Ad esempio se ci sono 2 SplitContainer - splitContaner1 (child) e splitContaner2 (parent) - per essere nidificati in fase di progettazione, quindi splitContaner1 (che è annidato) deve essere prima inserito nel modulo. Dopo quel genitore splitContaner2. All'ultimo splitContaner1 può essere nidificato in splitContaner2.Panel1 (o 2).

Questa regola garantisce lo stesso effetto delle proprietà (ad esempio la proprietà SplitterWidth) sia in fase di progettazione che in fase di esecuzione e salverà la necessità di scrivere codice aggiuntivo nel gestore eventi load o nel costruttore per correggere il "bug".