2009-05-18 18 views
7

Come impostare i miei controlli per la seguente situazione:C#/winform: come possono due dinamicamente condividere lo spazio disponibile?

Ho un contenitore padre ad esempio uno GroupBox.

All'interno di questo contenitore padre ho due controlli simili, ad esempio ListBox, uno accanto all'altro. Entrambi hanno le stesse dimensioni, quindi il confine tra loro due è esattamente nel mezzo dello GroupBox.

Ora quando lo GroupBox viene ridimensionato, desidero che anche gli ListBox vengano ridimensionati, ma i due devono sempre avere le stesse dimensioni dell'altro. Quindi anche il confine tra loro rimane nel mezzo dello GroupBox.

Quindi, come impostare le proprietà di questi tre controlli per ottenere i comportamenti desiderati?

risposta

13

È necessario un altro contenitore. Il TableLayoutPanel è la soluzione migliore. Usa 1 riga e 2 colonne e aggancia (Dock = Riempi) nella casella di gruppo. La larghezza di entrambe le colonne dovrebbe essere impostata al 50%. Successivamente è possibile aggiungere i controlli nelle singole celle e ancorarli (Dock = Fill)

+0

+1 Non è * necessario * un altro contenitore, tuttavia il metodo di tabella eseguirà il lavoro con meno codice rispetto a un altro contenitore. –

3

Forse una SplitContainer con le due metà fissate in modo uniforme e IsSplitterFixed set per true (per interrompere l'utente spostandolo):

[STAThread] 
static void Main() { 
    Application.EnableVisualStyles(); 
    Application.Run(new Form { 
     Controls = { new SplitContainer { 
      Width = 200, 
      IsSplitterFixed = true, 
      SplitterDistance = 100, 
      SplitterWidth = 1, 
      Dock = DockStyle.Fill, 
      Panel1 = { Controls = { 
        new ListBox { 
         IntegralHeight = false, 
         Dock = DockStyle.Fill, 
         BackColor = Color.Blue, 
         Items = {"abc","def","ghi"} 
        } 
       } 
      }, Panel2 = { Controls = { 
        new ListBox { 
         Dock = DockStyle.Fill, 
         BackColor = Color.Red, 
         IntegralHeight = false, 
         Items = {"jkl","mno","pqr"} 
        } 
       } 
      } 
     }} 
    });   
} 
+0

grazie! si, quella potrebbe essere un'opzione. ma è anche possibile senza un ulteriore contenitore? – clamp

1

È anche possibile senza SplitContainer.

Nell'evento di ridimensionamento della casella di gruppo impostare la posizione del primo controllo su {0,0} e del secondo su {GroupBox.Width/2,0} e impostare le dimensioni di entrambi su {GroupBox.Width/2, GroupBox.Height}

È inoltre necessario lasciare spazio attorno ai controlli in modo che non si sovrappongano al bordo del GroupBox.

private void groupBox1_Resize(object sender, EventArgs e) 
{ 
    groupBox1.SuspendLayout(); 

    listBox1.Location = new Point(7, 20); 
    listBox2.Location = new Point(groupBox1.Width/2, 20); 

    listBox1.Size = new Size(groupBox1.Width/2 - 6, groupBox1.Height - 27); 
    listBox2.Size = new Size((groupBox1.Width + 1)/2 - 6, groupBox1.Height - 27); 

    groupBox1.ResumeLayout(); 
} 
+1

È possibile impostare la larghezza della seconda casella su (GroupBox.Width + 1)/2. Ciò rende la scatola un pixel più larga quando la larghezza interna della casella di gruppo è dispari, ma evita un effetto "saltatore" tra la groupbox e il bordo della casella di riepilogo durante il ridimensionamento. – peterchen

+0

Buon punto, ho aggiornato la mia risposta –

Problemi correlati