Es gibt wahrscheinlich ein paar Möglichkeiten, dies zu tun. Ich habe mit ein paar experimentiert, aber keine sind perfekt. Ich würde sagen, der am wenigsten komplizierte Weg, den ich gefunden habe, ist die maximale Größe des ToolStripPanel wie Hans erwähnt, und auch Unterklasse der ToolStrip und überschreiben OnLocationChanged
(oder zuweisen Sie einen Event-Handler zu LocationChanged
anstatt Unterklassen, aber Sie müssten zuweisen ein Handler für jeden ToolStrip).
public class ToolStripEx : ToolStrip
{
protected override void OnLocationChanged(EventArgs e)
{
if (this.Location.Y >= this.Parent.MaximumSize.Height)
{
this.Location = new Point(this.Location.X, 0);
}
else
{
base.OnLocationChanged(e);
}
}
}
Hinweis: Dies bewirkt, dass die Maus hin und her springen, wenn sie versuchen, den Toolstrip nach unten zu ziehen, aufgrund der Tatsache, dass der Ort nach er zurückgesetzt wird bereits geändert, also bewegt es sich im Wesentlichen nach unten, springt dann sofort wieder hoch.
Es ist auch erwähnenswert, dass dies für den Benutzer ein Ärgernis sein kann, besonders wenn sie absichtlich versuchen, den ToolStrip in eine neue Reihe zu bringen, also würde ich das nicht wirklich empfehlen. Aber da du gefragt hast, da ist es.
-Update mit vollständigen Schritten und Code:
habe ich ein neues leeres Fenster Forms-Projekt. Ich habe eine neue Datei ToolStripEx.cs
zu der Lösung, und das ist, was drin ist:
für die anderen Platten aktualisiert und ihre Orientation
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public class ToolStripEx : ToolStrip
{
protected override void OnLocationChanged(EventArgs e)
{
if (this.Parent is ToolStripPanel)
{
ToolStripPanel parent = this.Parent as ToolStripPanel;
if (parent.Orientation == Orientation.Horizontal)
{
if (this.Location.Y != 0)
{
this.Location = new Point(this.Location.X, 0);
return;
}
}
else if (parent.Orientation == Orientation.Vertical)
{
if (this.Location.X != 0)
{
this.Location = new Point(0, this.Location.Y);
return;
}
}
}
base.OnLocationChanged(e);
}
}
}
Dann baute ich die Lösung, so dass die ToolStripEx
Klasse in der Toolbox angezeigt werden.
Dann legte ich eine regelmäßige ToolStripContainer
auf das Formular von der Toolbox gesetzt Dock
-Fill
, stellen Sie die Farben usw.
Dann schleppte ich zwei ToolStripEx
s (mit dem Zahnrad-Symbol Sie erwähnt) aus der Toolbox auf die TopToolStripPanel
. Ich setze ihre Farben und Renderer und was nicht.
Dies ist, was Form1.cs
sieht so aus: Verhindert, dass sie jede der Platten Dieser Code aus erweitert:
die anderen maximalen Größen
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.toolStripContainer1.TopToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
this.toolStripContainer1.LeftToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
this.toolStripContainer1.BottomToolStripPanel.MaximumSize = new Size(0, toolStripEx1.Height);
this.toolStripContainer1.RightToolStripPanel.MaximumSize = new Size(toolStripEx1.Height, 0);
}
}
}
Hinweis einstellen Aktualisiert Zeilen (oder Spalten, wenn sie eine Orientation
von Orientation.Vertical
haben) Wenn Sie die Seite Pfanne wollen Damit Sie expandieren können, stellen Sie nicht ihre maximale Größe ein und entfernen Sie den Abschnitt else if parent.Orientation == Orientation.Vertical
.
Das sollte alles sein, was es ist. Ich habe das ausgeführt, und beide ToolStripEx
s verschwanden nicht, wenn man sie bewegte.
Wie Hans sagte, die ToolStrip
Klasse ist ziemlich skurril und so ziemlich jede Lösung für Ihr Problem wird nicht perfekt sein, es sei denn Sie entwickeln Ihre eigenen Kontrollen von Grund auf mit Ihren Bedürfnissen im Hinterkopf. Wenn Sie aus irgendeinem Grund die Klasse ToolStripContainer
erweitern müssen, trennen Sie sie von der neuen Klasse . Ich vermute, dass die Verwendung der verschachtelten Klassen dazu führte, dass Sie immer noch die reguläreEstatt der ToolStripEx
Klasse verwenden.
Ein weiteres Update - Fixieren der Maus Springen: Das fand ich durch Zufall beim Experimentieren des Mauszeigers Problem loszuwerden. Fügen Sie diese auf die ToolStripEx
Klasse:
protected override void OnBeginDrag(EventArgs e)
{
//base.OnBeginDrag(e);
}
Merkwürdiger, das deutlich über den Toolstrip Widerstand zu reduzieren scheint außerhalb einer Platte gezogen werden.Ich habe nicht geforscht, warum das funktioniert, aber es scheint, als ob ToolStrip sein eigenes Ziehverhalten implementiert, ohne grundlegende Drag/Drop-Funktionalität zu verwenden und durch Überschreiben OnBeginDragDrop
nutzt das ToolStrip ausschließlich sein benutzerdefiniertes Verhalten, was die Maus beim Ziehen viel schöner macht es
Ha, gerade versucht es. Wie sehr merkwürdig. –
Ich habe das gesehen, aber glaube, es liegt daran, dass ich die Maus vertikal ein bisschen bewegt. So weit ich sagen kann, wenn die Maus tot horizontal bewegt, Es ist mir nicht passiert –