2009-03-03 6 views
2

Ich habe ein Windows Forms ToolStripPanel, dem ich dynamisch neue ToolStrips hinzufüge. Jeder ToolStrip hat ToolStripItems, die ich dynamisch hinzufüge (meistens ToolStripButtons).Ändern des ToolStripPanel-Überlaufverhaltens für dynamisch hinzugefügte ToolStripItems

Ich möchte, dass alle ToolStrips in eine Zeile passen, solange Sie alle ToolStripItems in jedem ToolStrip sehen können. Wenn das Hinzufügen eines neuen ToolStripItem zu einem ToolStrip zu einem Überlauf führt, möchte ich, dass der ToolStrip am Ende der Zeile in eine neue Zeile springt. Das einzige Mal, wenn ich den Overflow-Button sehen möchte, ist, dass der ToolStrip so viele Elemente enthält, dass sie nicht in die Breite des Formulars passen.

Ich möchte, dass dies das Standardverhalten ist, es sei denn, ein Benutzer bewegt einen ToolStrip manuell. Wenn der Benutzer den ToolStrip verschiebt, möchte ich, dass das vorhandene Überlaufverhalten (z. B. Überlaufschaltfläche mit Dropdownoptionen) auftritt. Ich nehme an, dass der Benutzer mit diesem standardmäßigen Winforms-Überlaufverhalten einverstanden ist, wenn er die Symbolleiste selbst positioniert.

Wenn eine neue dynamische Symbolleiste hinzugefügt wird, nachdem der Benutzer Dinge neu positioniert hat, möchte ich, dass die neue Symbolleiste rechts vom letzten ToolStrip in der unteren Zeile hinzugefügt wird. Diese Symbolleiste sollte das aktualisierte Überlaufverhalten aufweisen (z. B. eine neue Zeile verwenden, wenn Sie nicht passen können), bis der Benutzer sie manuell neu positioniert.

Ich habe einige der Forschung ohne großen Erfolg getan:

  • Dies scheint, wie es eine einfache Sache, eine ToolStripLayoutStyle zu ändern sein sollte, aber dies scheint nicht der Fall zu sein. (Im besten Fall werden neue Zeilen erstellt, wenn die Überlaufschaltfläche auf allen ToolStrips in einer bestimmten Zeile angezeigt wird).
  • Der MSDN-Artikel "How to: Manage ToolStrip Overflow in Windows Forms" scheint nur abzudecken, wenn/wann die Überlauf-Schaltfläche auftritt.
  • Es gibt ein LayoutCompleted Ereignis auf dem ToolStrip, das möglich scheint, um Dinge zu optimieren, es scheint, als sollte es einen einfacheren Weg geben.
  • Creating a custom LayoutEngine scheint wie ein Overkill für diese, da die eingebaute ist sehr nah an dem, was ich tun möchte.

Fehle ich eine einfache Lösung?

UPDATE: Immer noch auf der Suche nach einer guten Lösung. Es scheint, dass die LayoutCompleted-Route möglich ist. Das Problem dabei ist, dass es mehrmals aufgerufen wird. Einmal heißt es, das ToolStripItem befinde sich im Überlaufbereich und unmittelbar danach im Hauptbereich, daher scheint es nicht sicher zu sein, nur einmal zu überprüfen, ob es sich im Überlauf befindet.

Antwort

0

Am Ende glaube ich nicht, dass es eine gute einfache Lösung gibt. This thread macht deutlich, dass ToolStrips nicht wirklich für dynamische Szenarien als Priorität ausgelegt wurden.

Ein einzigartiger Ansatz besteht darin, die MinimumSize des ToolStrip auf die Größe aller Schaltflächen zu setzen. Dies wird beginnen mit Überlauf zu arbeiten, wie ich es beschreibe, aber selbst dies hat Probleme mit Randfällen.

Der beste Ansatz, den ich gefunden habe, ist alles zu tun, um ein gutes Gefühl für die Größe der Symbolleiste im Voraus zu bekommen und dann auf dem ToolStripPanel mit der Join Methode zu positionieren. Wenn Sie eine vernünftige Schätzung der Zeit machen, dann ist es wahrscheinlich in Ordnung, wenn Sie später weitere Schaltflächen hinzufügen, da sie im Überlaufbereich landen.In

2

1) vergleichen die Einzelteile zum Toolstrip

2) die Breite des Toolstrip auf die Menge an Platz auf der letzten Zeile links. Das ToolStripPanel hat eine Rows [] -Eigenschaft, die Ihnen sagt, was die letzte Zeile ist und welche Toolstrips in dieser Zeile sind. Addiere ihre Breiten und subtrahiere sie von der Breite des Panels.

3) Fügen Sie den neuen Toolstrip mit der Join-Methode zum Panel hinzu, indem Sie entweder die letzte Zeile (falls sie passt) oder eine Zeile höher (falls nicht) angeben.

Verwandte Themen