2010-04-23 13 views
5

Gibt es alternative Steuerelemente, die jemand vorschlagen kann, den WinForms SplitContainer zu ersetzen? Ich mag es nicht, wie der SplitContainer diesen seltsamen, gepunkteten Streifen zeigt, wenn er ausgewählt und gezogen wird. Ich möchte die Größe der Panels ändern, wenn der Benutzer statt mit der Maus nach oben zieht und keine gepunkteten Streifen zeigt, wenn der Splitter gezogen wird. Im Grunde genommen, wie die Größenanpassung von Panels in Windows Explorer auf Vista erfolgt.WinForms: Alternative zu SplitContainer?

Dies ist die gepunktete Sache ich spreche:

splitter

Antwort

8

Ihren eigenen Split Container Usercontrol schreiben. Sie lassen im Grunde nur zwei Panels auf das Steuerelement (für die linken und rechten Platten) und dann den Raum zwischen ihnen der Splitter sein. Eine kleine MouseDown, MouseMove und MouseUp Logik auf dem UserControl selbst lässt Sie den "Splitter" leicht nach links und rechts bewegen, und die beiden Panels werden dies überall aber über den Splitter richtig blockieren, also Ihre Logik zum Überprüfen ob die Maus über den Splitter ist so einfach wie nur möglich.

Es kann ein wenig mehr Arbeit bedeuten, die Steuerung so zu steuern, wie Sie es im Entwurfsmodus ausführen möchten.

+0

kommen Nun, ich dies einen Versuch gebe, jedoch mit dem Mousemove-Ereignisse über die Kontrolle, wird das Ereignis aus, wenn die Maus Brennen stoppen ist zu schnell bewegt und es geht über eines der Panels. Gibt es eine Möglichkeit, die Maus dazu zu bewegen, Ereignisse auf das Steuerelement zu übertragen oder das Steuerelement alle Mausbewegungsereignisse abfangen zu lassen? – Telanor

+0

Nevermind, ich hakte die MouseMove-Ereignisse aller Steuerelemente auf die gleiche Funktion. Es hat gut geklappt – Telanor

+0

Ich sollte ausgearbeitet, dass zusätzlich die Mausereignisse zu Handhabung, möchten Sie auch einen bool oder etwas zu speichern, ob die Maustaste zur Zeit ist oder nicht (wie in Hans' Antwort). Wenn Sie die Maustaste auf ein Steuerelement klicken und halten, wird ein MouseDown-Ereignis für dieses Steuerelement generiert. Wenn Sie die Maustaste gedrückt halten und nach links oder rechts (oder nach oben oder unten) ziehen, werden die MouseMove-Ereignisse alle vom Steuerelement generiert, auf das Sie geklickt haben, auch wenn der Mauszeiger vom ursprünglichen Steuerelement auf ein anderes oder wechselt das Elternformular. – MusiGenesis

1

Sie können überhaupt nicht mit SplitContainer basteln. Eine Möglichkeit besteht darin, sie vollständig zu eliminieren, wenn Sie sie nur zum Ändern der Größe eines Steuerelements verwenden. Sie können stattdessen Mausereignisse für das Steuerelement selbst verwenden. Legen Sie eine TreeView auf ein Formular und docken Sie es auf der linken Seite an. Abonnieren Sie den MouseDown-/Bewegen/Up Events und schreiben Sie etwas wie folgt aus:

bool mDragging; 

    private bool onTreeEdge(Point pos) { 
     return pos.X >= treeView1.DisplayRectangle.Right - 3; 
    } 
    private void treeView1_MouseMove(object sender, MouseEventArgs e) { 
     treeView1.Cursor = mDragging || onTreeEdge(e.Location) ? Cursors.VSplit : Cursors.Default; 
     if (mDragging) treeView1.Width = e.X; 
    } 
    private void treeView1_MouseDown(object sender, MouseEventArgs e) { 
     mDragging = onTreeEdge(e.Location); 
     if (mDragging) treeView1.Capture = true; 
    } 
    private void treeView1_MouseUp(object sender, MouseEventArgs e) { 
     mDragging = false; 
    } 
5

Das fand ich, nachdem ich Ihre Frage sah, dachte so würde ich teilen: SplitContainer FAQ

Der zweite Link dort genau sagt was musst du machen.

Hier ist der Text für den Fall, dass der Link jemals stirbt.

//1. Use the custom control defined in the SplitContainerNoFocus sample 
//2. Insert the following code in your project, and attach these events to all of the SplitContainers that you don't want stealing focus. 

// Temp variable to store a previously focused control 
private Control focused = null; 

private void splitContainer_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Get the focused control before the splitter is focused 
    focused = getFocused(this.Controls); 
} 

private Control getFocused(Control.ControlCollection controls) 
{ 
    foreach (Control c in controls) 
    { 
     if (c.Focused) 
     { 
     // Return the focused control 
     return c; 
     } 
     else if (c.ContainsFocus) 
     { 
     // If the focus is contained inside a control's children 
     // return the child 
     return getFocused(c.Controls); 
     } 
    } 
    // No control on the form has focus 
    return null; 
} 

private void splitContainer_MouseUp(object sender, MouseEventArgs e) 
{ 
    // If a previous control had focus 
    if (focused != null) 
    { 
     // Return focus and clear the temp variable for 
     // garbage collection 
     focused.Focus(); 
     focused = null; 
    } 
} 
+2

Link ist tot, [hier ist die Zombie-Version] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

brauchte ich das gleiche und die folgenden Eigenschaften:

 splitContainer1.Anchor = (AnchorStyles.Top | AnchorStyles.Left); 
     splitContainer1.Dock = DockStyle.Fill; 
     splitContainer1.IsSplitterFixed = true; 

Hoffnung, das hilft.

-1

Auch einen Blick auf der Split-Container-Komponente übernehmen, die mit den freien Krypton toolkit

+0

Die Verbindung ist tot. – Krythic