Frage

Ich verwende .net 2.0 mit Visual Studio 2005 und ich versuche, zwei verschiedene Toolstrips an die Spitze der Form hinzuzufügen, so dass sie Seite an Seite angezeigt. Ich mag es wie Word 2003 sein, wo Sie mehrere Toolstrips auf die gleiche Zeile hinzufügen können, und haben sie in einer Linie zueinander zeigen, anstatt eine Zeile zu jedem Toolstrip widmen.

Also habe ich ein Toolstrippanel und koppelte es an die Spitze der Form hinzugefügt (ich keinen Toolstripcontainer verwendet habe, weil ich alle zusätzliche Platten nicht brauchen, ich brauche nur das eine an der Spitze). Ich habe beide Toolstrips und setzen ihre Stretch-Eigenschaften auf False. Ich kann erhalten sie im Designer-Fenster Seite an Seite zu zeigen, aber zur Laufzeit trennt die Toolstrippanel die Toolstrips und gibt jedem Toolstrip über eine eigene Reihe. Als ob Beleidigung Verletzung hinzuzufügen, wenn ich Debuggen beenden und an den Designer wieder zurück, ich finde, dass der Designer als auch die Toolstrips, um ihre eigene Reihe bewegt sich! Mache ich etwas falsch hier?

Ich habe den ganzen Tag googeln und einige Informationen über ein ToolStripPanelRow Objekt gefunden, aber ich weiß nicht eine einfache Möglichkeit sehen Toolstrips, um es hinzuzufügen (dh es hat keine ToolStripPanelRow.Controls.Add Methode oder etwas ähnliches ), die alle es hat eine Controls () Eigenschaft, die ein Array von Steuerobjekten zurück, und ich habe nicht viel Glück versuchen, fügen sie Artikel zu diesem Array hatte. Ich fand auch eine Dokumentation über die ToolStripPanel.Join Methode, die wie es sich anhört sollte die Arbeit tun, so dass ich versuchte alle drei Überlastungen aber sie funktionieren nicht wie beworben. Egal, was ich tun oder welche Optionen ich versuche, es fügt immer die neue Toolstrip an die Spitze der Platte auf einer eigenen Zeile und schiebt alles andere nach unten.

Im Interesse einer vollständigen Offenlegung Ich sollte Sie warnen, dass ich die Toolstrippanel haben und einer der Toolstrips zu einer Basisklasse Form hinzugefügt, und ich versuche, die anderen Toolstrip zu einer Unterklasse Formular hinzuzufügen, die von der Basisklasse Form erbt. Die Toolstrippanel und Toolstrip in der Basisklasse Form deklariert beide „Protected Friend“, so sollte dies funktionieren. Wie ich bereits erwähnt, sind die Designer-Fenster der Unterklasse Form wird mir erlauben, es zu tun (zumindest für eine Zeit).

Wenn jemand kann mir diese Arbeit bekommen helfen oder zumindest etwas Licht auf, warum es nicht, wäre ich sehr dankbar.

War es hilfreich?

Lösung

Ich habe einen benutzerdefinierten Toolstrippanel, so dass ich die Layoutengine überlasten könnte;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomToolStripPanel : ToolStripPanel
  {
    private LayoutEngine _layoutEngine;

    public override LayoutEngine LayoutEngine
    {
      get
      {
        if (_layoutEngine == null) _layoutEngine = new CustomLayoutEngine();
        return _layoutEngine;
      }
    }

    public override Size GetPreferredSize(Size proposedSize)
    {
      Size size = base.GetPreferredSize(proposedSize);

      foreach(Control control in Controls)
      {
        int newHeight = control.Height + control.Margin.Vertical + Padding.Vertical;
        if (newHeight > size.Height) size.Height = newHeight;
      }

      return size;
    }
  }
}

Dann legt die benutzerdefinierte Layoutengine die Toolstrips aus;

using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;

namespace CustomGUI
{
  class CustomLayoutEngine : LayoutEngine
  {
    public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
    {
      Control parent = container as Control;

      Rectangle parentDisplayRectangle = parent.DisplayRectangle;

      Control [] source = new Control[parent.Controls.Count];
      parent.Controls.CopyTo(source, 0);

      Point nextControlLocation = parentDisplayRectangle.Location;

      foreach (Control c in source)
      {
        if (!c.Visible) continue;

        nextControlLocation.Offset(c.Margin.Left, c.Margin.Top);
        c.Location = nextControlLocation;

        if (c.AutoSize)
        {
          c.Size = c.GetPreferredSize(parentDisplayRectangle.Size);
        }

        nextControlLocation.Y = parentDisplayRectangle.Y;
        nextControlLocation.X += c.Width + c.Margin.Right + parent.Padding.Horizontal;
      }

      return false;
    }
  }
}

Eine Sache, die eine Weile gedauert, ist, dass die Lage / Größe eines Toolstrip Artikel zu ändern bewirkt, dass die Layout-Feuer wieder mit den neu geordnet Kontrollen. Also nehme ich eine Kopie der Kontrollen vor der Layout-Schleife. Und man kann nicht verwenden AddRange (...) aus irgendeinem Grunde, Elemente in den benutzerdefinierten Bedienfelder hinzufügen -. Hinzufügen müssen (...), um ihnen einen nach dem anderen

hofft, dass hilft (es auf MSDN Layoutbeispiel , für ToolStripPanels fest)

Wyzfen

Andere Tipps

System.Windows.Forms.FlowLayoutPanel kann die Arbeit machen.

Einfach der Toolstrip mit richtigen Reihenfolge in ihr steuert.

ich in Ihrem Fall denken, können Sie entkommen mit nur den Layoutstyle Einstellung auf dem Toolstrip zu ToolStripLayoutStyle.HorizontalStackWithOverflow anstatt Ihre eigenen Layoutengine benötigen.

Ich fragte eine andere Frage zu einem ähnlichen Thema wie das Layout mit dynamischen Elementen zu handhaben einem bessere Kontrolle über den Überlauf zu haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top