2009-09-24 14 views
8

.NET Framework/C#/Windows FormFlowLayoutPanel autowrapping non funziona con autosize

mi piacerebbe il FlowLayoutPanel per regolare automaticamente la larghezza o l'altezza a seconda del numero di controlli all'interno di esso. Dovrebbe anche cambiare il numero di colonne/righe se non c'è abbastanza spazio (avvolgere il suo contenuto). Il problema è che se imposto il dimensionamento automatico, il pannello di visualizzazione dei flussi non esegue il wrapping dei controlli che inserisco. Quale soluzione è la migliore?

Grazie!

+0

Sono sorpreso che nessuno abbia risposto a questo, sto avendo lo stesso problema. Bump? – echo

+1

TableLayoutPanel potrebbe essere una soluzione migliore per te: ha incorporato il supporto per il ridimensionamento automatico di colonne e righe, nonché la dimensione automatica per l'intero pannello. – Bevan

risposta

0

Stai aggiungendo i controlli dinamicamente in base alle azioni dell'utente? Temo che sarà necessario modificare le proprietà FlowLayout al volo nel codice, quando si aggiungono nuovi controlli ad esso, quindi l'aggiornamento del modulo farebbe il trucco.

1

Hai provato a utilizzare il TableLayoutPanel? È molto utile per posizionare i controlli all'interno delle celle.

1

Non esiste una cosa come impossibile nello sviluppo del software. Impossibile, richiede più tempo.

Ho studiato il problema. Se c'è davvero bisogno di Flow Layout, può essere fatto con un po 'di lavoro. Poiché FlowLayoutPanel espone i controlli senza pensare in modo particolare al numero di righe/colonne, ma piuttosto alla larghezza/altezza cumulativa, potrebbe essere necessario tenere traccia del numero di controlli che hai già aggiunto. Prima di tutto, imposta l'autosize su false, quindi aggancia la tua logica di gestione delle dimensioni agli eventi ControlAdded/ControlRemoved. L'idea è quella di impostare la larghezza e l'altezza del pannello in modo tale, che otterrete il vostro numero desiderato di 'colonne' là

proof of concept sporco:

private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e) 
    { 
     int count = this.flowLayoutPanel1.Controls.Count; 
     if (count % 4 == 0) 
     { 
      this.flowLayoutPanel1.Height = this.flowLayoutPanel1.Height + 70; 
     } 
    } 

se il pannello ha inizialmente larghezza per 4 controlli, genererà una riga per quelli nuovi. ControlRemoved handler dovrebbe controllare lo stesso e diminuire l'altezza del pannello, oppure ottenere tutti i controlli contenuti e posizionarli nuovamente. Dovresti pensarci, potrebbe non essere il tipo di cosa che vuoi. Dipende dagli scenari di utilizzo. Tutti i controlli saranno della stessa dimensione? Altrimenti, avresti bisogno di una logica più complicata.

Ma in realtà, pensa al layout della tabella: puoi avvolgerlo in una classe helper o ricavarne un nuovo controllo, in cui dovrai risolvere tutta la logica di posizionamento del controllo. FlowLayout semplifica l'aggiunta e la rimozione dei controlli, ma poi inserisce il codice di gestione delle dimensioni. TableLayout offre un buon meccanismo per righe e colonne, la gestione di larghezza e altezza è più semplice, ma è necessario più codice per modificare la posizione di tutti controlla se vuoi rimuoverne uno dal modulo in modo dinamico.

1

Se possibile, suggerisco di ridimensionare il FlowLayoutPanel in modo che utilizzi tutta la larghezza disponibile e quindi ancorarlo in alto, a sinistra ea destra. Questo dovrebbe farlo crescere in altezza, se necessario, mentre ancora avvolge i controlli.

+1

Ma come si dice a 'FlowLayoutPanel' di aggiornare automaticamente la proprietà' Height' in base a quante linee è necessario creare quando si avvolge il contenuto? Mi piace l'idea di ancorare Top, Left e Right, ma l'altezza del mio 'FlowLayoutPanel' sembra rimanere costante ... – binki

2

Impostare MaximumSize di FlowLayoutPanel sulla larghezza che si desidera avvolgere su. Imposta WrapContents = true.

+0

L'impostazione della dimensione massima richiede ancora il calcolo – Smith

Problemi correlati