2010-05-04 6 views
5

Eine ToolStripComboBox wird nach einem ToolStripButton platziert und wird von einem anderen Tool gefolgt, das rechts ausgerichtet ist. Wie richte ich die ToolStripComboBox am besten so ein, dass ihre Länge immer so angepasst wird, dass sie den gesamten verfügbaren Platz zwischen den vorhergehenden und den folgenden ToolStripButtons ausfüllt?Wie erstellt man eine ToolStripComboBox, um den gesamten verfügbaren Platz auf einem ToolStrip zu füllen?

In der Vergangenheit habe ich ein Eltern-Resize-Ereignis behandelt, berechne die neue Länge, um basierend auf benachbarten Elementkoordinaten festzulegen und die neue Größe festzulegen. Aber jetzt, während ich eine neue Anwendung entwickle, frage ich mich, ob es keinen besseren Weg gibt.

Antwort

1

Es gibt keine automatische Layout-Option dafür. Sie können dies jedoch leicht tun, indem Sie das ToolStrip.Resize-Ereignis implementieren. Dies funktionierte gut:

private void toolStrip1_Resize(object sender, EventArgs e) { 
     toolStripComboBox1.Width = toolStripComboBox2.Bounds.Left - toolStripButton1.Bounds.Right - 4; 
    } 
    protected override void OnLoad(EventArgs e) { 
     toolStrip1_Resize(this, e); 
    } 

Seien Sie sicher, dass der TSCB des AutoResize Eigenschaft auf False setzen oder es wird nicht funktionieren.

+0

Hier geht ein Problem (ich kann mich nicht erinnern, dass ich solche in der Vergangenheit hatte, als ich V2005 verwendete). Bei jeder ungeraden Signifikanz (der Effekt tritt nicht auf, wenn der Größenunterschied so klein wie ein paar Pixel oder so ist) Größenverringerung verschwindet ein ToolStripComboBox (erscheint, wenn ich es wieder verkleinere (und verschwindet wieder, wenn ich es noch einmal verkleinere)) oder erhöhen Sie es). AutoResize ist auf "false" gesetzt, eine Erhöhung der zu subtrahierenden Ziffer (in Ihrem Beispiel 4) hat nicht geholfen. Der ToolStrip befindet sich in einem SplitContainer-Bedienfeld und wird bei jeder Größenänderung eines Modells durch Ziehen des SplitContainer-Splitters skaliert. – Ivan

+0

Der am häufigsten auftretende Fall des von mir beschriebenen Problemmusters ist das Wiederherstellen eines Formulars aus dem maximierten Zustand - beide ToolStripComboBoxes (im linken Bereich und im rechten Bereich) verschwinden in diesem Fall. – Ivan

+0

Um das 'ToolStripComboBox' daran zu hindern, zu verschwinden, nachdem das 'Benutzerformular' aus dem maximierten Zustand in der Größe geändert wurde, benutzte ich diesen Hack:' ToolStripComboBox.Visible = false; ToolStripComboBox.Visible = true; 'im' toolStrip1_Resize'-Ereignishandler direkt nach 'toolStripComboBox1.Width = ...'. HTH – dee

5

Ich benutze den folgend mit großem Erfolg:

private void toolStrip1_Layout(System.Object sender, System.Windows.Forms.LayoutEventArgs e) 
{ 
    int width = toolStrip1.DisplayRectangle.Width; 

    foreach (ToolStripItem tsi in toolStrip1.Items) { 
     if (!(tsi == toolStripComboBox1)) { 
      width -= tsi.Width; 
      width -= tsi.Margin.Horizontal; 
     } 
    } 

    toolStripComboBox1.Width = Math.Max(0, width - toolStripComboBox1.Margin.Horizontal); 
} 

Der obige Code leidet nicht an dem disapearing Steuerungsproblem.

+2

Verwendung von VS2010/.NET 4: Wenn ich das Formular sehr schnell skaliere, bekomme ich immer noch das Problem der verschwindenden Steuerelemente. Aber es ist leicht zu lösen, indem Sie toolStrip1.PerformLayout() in der resize Event-Handler des Formulars hinzufügen. –

+0

Dies scheint nicht ordnungsgemäß zu funktionieren, wenn Sie eine andere dpi-Einstellung als 96 dpi verwenden. Die Breite wird nach der Einstellung skaliert, wodurch sie zu groß wird. – kjbartel

1
ToolStrip ts = new ToolStrip(); 

ToolStripComboBox comboBox = new TooLStripComboBox(); 
comboBox.Dock = DockStyle.Fill; 

ts.LayoutStyle = ToolStripLayoutStyle.Table; 
((TableLayoutSettings)ts.LayoutSettings).ColumnCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).RowCount = 1; 
((TableLayoutSettings)ts.LayoutSettings).SetColumnSpan(comboBox,1); 

ts.Items.Add(comboBox); 

Jetzt wird die Combobox korrekt angedockt. Legen Sie die Spalten- oder Zeilenspanne entsprechend fest.

Verwandte Themen