2013-02-27 1 views
5

Wenn ich einen Werkzeugstreifen nach links ziehe (vielleicht nur um ihn in die Ecke zu bekommen) mit einem anderen Werkzeugstreifen in demselben Werkzeugstreifen Panel, der eine, den ich ziehe, springt in eine 'neue' Zeile, als ob ich ihn nach unten bewegt hätte. Es ist ziemlich schwierig zu erklären, also hier ist ein paar Diagramme.Wenn Sie den Werkzeugstreifen nur etwas zu weit nach links bewegen, wird eine neue Reihe erstellt, wenn sich ein anderer Werkzeugstreifen auf dem gleichen Werkzeugstreifen befindet.

Diagramm A: Ich bewege den Toolstrip nach links und "versehentlich" zu weit nach links (naja, nur um ein paar Dutzend Pixel, was Benutzer leicht tun können).

Diagramm B: Dies geschieht, der gezogene Toolstrip fällt eine Zeile nach unten.

enter image description here

Wie kann ich verhindern, dass diese neue Reihe vor einem ‚erstellt‘? Als letzten Ausweg würde ich gerne verhindern, dass neue Zeilen unter allen Umständen erstellt werden (z. B. wenn der Benutzer beabsichtigte, sie zu ziehen, um eine neue Zeile zu erstellen).

Ich habe mit LayoutStyle vergeblich experimentiert.

+0

Ha, gerade versucht es. Wie sehr merkwürdig. –

+0

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 –

Antwort

1

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

+0

Danke. Ja, unglücklicherweise, wenn ich die Lösung von Hans in Kombination mit Ihrer benutze, bekomme ich immer noch das Problem des verschwindenen Werkzeugstreifens. Zu Ihrer Information, wenn es verschwindet, bewegt es sich wahrscheinlich in eine neue Zeile unterhalb des aktuellen, so dass es nicht wirklich 'gelöscht' wurde. –

+0

@DanW Es sollte nicht in eine neue Zeile verschoben werden, da die Position im Wesentlichen auf ein Y von 0 beschränkt ist. Als ich das getestet habe, konnte ich den Toolstrip nicht verschwinden lassen. Und ich habe gesehen, wie der Werkzeugstreifen verschwand, als ich andere Dinge ausprobierte. Vielleicht könnten Sie Ihre Frage bis jetzt mit Ihrem genauen Code aktualisieren? – sparky68967

+1

Okay aktualisiert. Versuchen Sie übrigens, den Toolstrip einfach vom TopToolStripPanel nach unten in das ContentPanel zu ziehen, und Sie werden das Problem schneller und einfacher sehen (es verschwindet). Hast du dieses Problem auch? –

1

Wie wäre es, wenn Sie das Layout auf OnMouseLeave aussetzen und es wieder aktivieren OnMouseEnter/OnMouseUp/etc?

public class ToolStripContainerFix : ToolStripContainer 
{ 
    public ToolStripContainerFix() 
     : base() 
    { 
     this.TopToolStripPanel.MouseLeave += TopToolStripPanel_MouseLeave; 
     this.TopToolStripPanel.MouseEnter += TopToolStripPanel_MouseEnter; 
    } 

    void TopToolStripPanel_MouseLeave(object sender, EventArgs e) 
    { 
     this.TopToolStripPanel.SuspendLayout(); 
    } 

    void TopToolStripPanel_MouseEnter(object sender, EventArgs e) 
    { 
     this.TopToolStripPanel.ResumeLayout(); 
    } 
} 

Sie müßten mit dieser Geige, damit sie ihren außerhalb des Formulars überprüft, eher als die Kontrolle selbst ... Auf diese Weise kann neue erlauben könntet Zeilen erstellt werden, wenn beabsichtigt.

+0

Vielen Dank Leider scheinen andere Bugs einzuschleichen. Wenn Sie zum Beispiel den anderen Toolstrip nach links ziehen, wird er manchmal unter dem anderen Toolstrip versteckt, und manchmal kann ich nicht ziehen es überhaupt nach ein wenig. –

+0

Haben Sie Layout fortgesetzt? Sie müssten auf die Maus Ereignisse (Enter/Mouse Up) zu r e-aktivieren Layout-Änderungen. –

+0

Nein, habe ich nicht, aber ich sehe, Sie haben den Code aktualisiert, also habe ich das versucht. Leider bekomme ich immer noch Probleme mit "festgefahrenen" und "verschwindenden" Toolstrips und/oder "fusionierten" Toolstrips. Versuchen Sie zum Beispiel, den ersten Werkzeugstreifen zu weit nach links zu bewegen, und bewegen Sie dann die Maus über den "Ziehen" -Teil des anderen Werkzeugstreifens, und der erste verschwindet. –

1

Die Tooltrip-Klassen in Winforms sind ziemlich skurril. Sie wurden in .NET 2.0 veröffentlicht und das Winforms-Team wurde danach ziemlich schnell aufgelöst. Viele Teammitglieder sind in das WPF-Projekt eingezogen. Diese Macken wurden nie angesprochen. Es gibt sehr wenig, was Sie selbst tun können, der Großteil des Tooltrip-Codes ist gesperrt, ohne dass das Verhalten außer Kraft gesetzt werden kann. Es gibt auch eine Menge davon, also ist auch das Neuschreiben nicht praktisch.

Sie können verhindern, dass die Zeile vertikal wächst. Sie tun dies, indem Sie die Eigenschaft Maximum auf der oberen Toolstrip Content-Panel einstellen:

public Form1() { 
     InitializeComponent(); 
     toolStripContainer1.TopToolStripPanel.MaximumSize = 
      new Size(0, toolStrip1.Height); 
    } 

Aber wenn man bei diesem Spiel um werden Sie feststellen, dass dies ein Toolstrip ganz verschwinden lassen kann. Keine saubere Lösung dafür.

Beachten Sie, dass dies nicht wirklich ein echtes Problem ist, die Positionen der Toolstrips sind die Wahl des Benutzers und Sie sollten in keiner Weise helfen. Sie können darauf zählen, dass der Benutzer sie logisch anordnet.

+0

Danke, ich habe auch eine der anderen Symbolleisten beim Versuch, dies zu erkennen, erlebt. Unglücklicherweise ist das Problem ein Problem in dem Sinne, dass es die Dinge für meine Benutzer irritiert, also werde ich die anderen zwei Antworten versuchen. –

Verwandte Themen