2013-03-25 12 views
12

Ho un problema con un FlowLayoutPanel e non so come risolverlo.Come ottenere FlowLayoutPanel.AutoSize per lavorare con FlowBreak

Sto posizionando due FlowLayoutPanel all'interno di un altro; il secondo flp interno ha 3 pulsanti all'interno.

enter image description here

Gli oggetti di FlowLayoutPanel bambino sono:

FlowDirection = LeftToRight; 
AutoSize = true; 
AutoSizeMode = GrowAndShrink; 
WrapContents = true; 

Ora ho impostato per ogni pulsante la proprietà FlowBreak al vero, tuttavia il comportamento che vedo non è quello che voglio, voglio il FlowLayoutPanel a ridursi alla larghezza dei pulsanti,

enter image description here

Cambiare FlowDirection a UpToDown non è un'opzione.

Qualcuno sa perché AutoSize non funziona?

questo è il codice.

// 
//FlowLayoutPanel1 
// 
this.FlowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
this.FlowLayoutPanel1.Controls.Add(this.FlowLayoutPanel3); 
this.FlowLayoutPanel1.Location = new System.Drawing.Point(84, 77); 
this.FlowLayoutPanel1.MinimumSize = new System.Drawing.Size(10, 10); 
this.FlowLayoutPanel1.Name = "FlowLayoutPanel1"; 
this.FlowLayoutPanel1.Size = new System.Drawing.Size(308, 265); 
this.FlowLayoutPanel1.TabIndex = 0; 
// 
//FlowLayoutPanel3 
// 
this.FlowLayoutPanel3.AutoSize = true; 
this.FlowLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
this.FlowLayoutPanel3.Controls.Add(this.Button1); 
this.FlowLayoutPanel3.Controls.Add(this.Button2); 
this.FlowLayoutPanel3.Controls.Add(this.Button3); 
this.FlowLayoutPanel3.Location = new System.Drawing.Point(127, 3); 
this.FlowLayoutPanel3.MinimumSize = new System.Drawing.Size(10, 10); 
this.FlowLayoutPanel3.Name = "FlowLayoutPanel3"; 
this.FlowLayoutPanel3.Size = new System.Drawing.Size(162, 87); 
this.FlowLayoutPanel3.TabIndex = 1; 
// 
//Button1 
// 
this.FlowLayoutPanel3.SetFlowBreak(this.Button1, true); 
this.Button1.Location = new System.Drawing.Point(3, 3); 
this.Button1.Name = "Button1"; 
this.Button1.Size = new System.Drawing.Size(75, 23); 
this.Button1.TabIndex = 0; 
this.Button1.Text = "Button1"; 
this.Button1.UseVisualStyleBackColor = true; 
// 
//Button2 
// 
this.FlowLayoutPanel3.SetFlowBreak(this.Button2, true); 
this.Button2.Location = new System.Drawing.Point(3, 32); 
this.Button2.Name = "Button2"; 
this.Button2.Size = new System.Drawing.Size(75, 23); 
this.Button2.TabIndex = 1; 
this.Button2.Text = "Button2"; 
this.Button2.UseVisualStyleBackColor = true; 
// 
//Button3 
// 
this.Button3.Location = new System.Drawing.Point(3, 61); 
this.Button3.Name = "Button3"; 
this.Button3.Size = new System.Drawing.Size(75, 23); 
this.Button3.TabIndex = 2; 
this.Button3.Text = "Button3"; 
this.Button3.UseVisualStyleBackColor = true; 
+0

questo è il problema nella mia GUI un controllo https://docs.google.com/document/d/1I6OtboresNk-gfOR3sEM8gyYHVX9sGohdNtX6heeQwI/edit?usp=sharing quando ho messo 2 controlli e impostare FlowBrake a True https://docs.google.com/document/d/17C02PoL8LCyymfXNtEP8N6kkzZETxkiOCb6mPTbzGf0/edit?usp = sharing Desidero che i controlli rimangano attivi, ma poiché la modifica della larghezza non si adatta. – Natalia

+0

Puoi aggiungere due immagini, una con quello che hai e un'altra con quello che cerchi di ottenere. Dalla descrizione del testo non è chiaro quale problema stai affrontando con –

+0

Ho aggiunto una nuova immagine con il risultato e nel mio commento precedente ho inserito due collegamenti con il comportamento sulla GUI – Natalia

risposta

13

È un bug, è in circolazione da molto tempo. Il problema è che il motore di layout per FlowLayoutPanel calcola la larghezza della prima riga errata, inclusa la larghezza del 2 ° controllo, anche se è stata spostata sulla seconda riga.

La soluzione è sciocca ma efficace, aggiungere un pannello fittizio con una larghezza di 0 dopo il primo controllo. Se lo stai facendo con il designer, prima rilasciatelo e trascinalo nel posto giusto, a destra del 1 ° controllo. Quindi imposta Margine su (0, 0, 0, 0) e Dimensione su (0, 0) nella finestra Proprietà.

+0

Salvato il mio giorno .. Grazie !! – vendettamit

2

Non una soluzione, ma una soluzione alternativa. Sembra che tu stia cercando di simulare il comportamento di TableLayoutPanel utilizzando le interruzioni di flusso in FlowLayoutPanel. Hai provato a utilizzare TableLayoutPanel? Secondo i tuoi screenshot nei commenti, dovrebbe funzionare perfettamente per le tue esigenze.

+0

Nella mia gui, l'utente può organizzare l'ordine e la posizione di qualsiasi pulsante. l'utente può anche trascinare e rilasciare il pulsante dentro e fuori dal contenitore. se creo un pannello di layout di tabella, quando l'utente lascia il controllo su questo, il comportamento della tabella non è banale, perché, possiamo avere una colonna di controllo o una riga o una tabella. – Natalia

+0

@Natalia: stai cercando di implementare [questo] (http://www.devexpress.com/Products/NET/Controls/WinForms/Layout/)? – Neolisk

6

Non credo che FlowLayoutPanel sia stato progettato per fare ciò che si sta tentando di fare. Un TableLayoutPanel sarebbe probabilmente più adatto. Aggiungi un TableLayoutPanel con una singola colonna e aggiungi ciascun pulsante a una riga.

Modifica: Ho trovato un lavoro di hacker in giro. Dopo il primo pulsante, creare un pannello con la dimensione di 0,0 e il margine di 0,0. Assicurati che FlowBreak sia impostato su falso.

enter image description here

Edit: Hai solo bisogno di creare un pannello, dopo il primo pulsante, non uno per ciascuno.

+1

Stessi pensieri, stessa ora. Upvoting ... :) – Neolisk

+0

@ Michael G Proverò questo, attendo qualche minuto ... – Natalia

+1

Il tuo lavoro "hackish around" è incredibile. Ho provato a trovarne uno simile, ma il controllo del pannello non mi è venuto in mente. Vorrei poterti dare un altro upvote per quello. – Neolisk

Problemi correlati