2010-04-23 17 views
5

Czy są jakieś alternatywne sposoby sterowania, które ktoś może zasugerować, aby zastąpić WinForms SplitContainer? Nie podoba mi się, jak SplitContainer pokazuje dziwny, przerywany pasek, gdy jest wybrany i kiedy jest przeciągany. Chcę, aby panele były ponownie wymiarowane, gdy użytkownik przeciąga zamiast myszy w górę i nie pokazuje żadnych przerywanych pasków podczas przeciągania splittera. Zasadniczo jak wszystkie zmiany rozmiaru paneli odbywa się w Eksploratorze Windows na Vista.WinForms: Alternatywa dla SplitContainer?

To jest przerywana, co mówię:

splitter

Odpowiedz

8

Napisz Podział pojemnik UserControl. Zasadniczo po prostu upuść dwa panele na sterowanie (dla lewego i prawego panelu), a następnie niech przestrzeń między nimi będzie rozdzielaczem. Mała logika MouseDown, MouseMove i MouseUp na UserControl sama pozwoli ci łatwo przesuwać "splitter" w lewo i prawo, a dwa panele będą właściwie blokować to wszędzie, ale nad rozdzielaczem, więc twoja logika do sprawdzania, czy mysz, jeśli nad splitter jest tak prosty, jak tylko może być.

Może to być trochę dodatkowa praca, która sprawi, że sterowanie zadziała tak, jak chcesz, aby działało w trybie projektowania.

+0

No daję tego spróbować, jednak ze zdarzeniem mouseMove sprawie kontroli, wydarzenie zatrzyma wypalania Jeśli mysz porusza się zbyt szybko i przechodzi przez jeden z paneli. Czy istnieje sposób, aby ruchy myszki podskoczyły do ​​kontroli, czy też sterowanie złapie wszystkie ruchy myszy? – Telanor

+0

Nieważne, po prostu podpiąłem zdarzenia MouseMove wszystkich kontrolek do tej samej funkcji. Udało się dobrze – Telanor

+0

Powinienem był opracowany, że oprócz obsługi zdarzeń myszy, chcesz również bool lub coś do przechowywania, czy przycisk myszy jest obecnie w dół, czy nie (jak w odpowiedzi Hansa). Jeśli klikniesz i przytrzymasz przycisk myszy na formancie, wygeneruje zdarzenie MouseDown na tym sterowaniu. Jeśli przytrzymasz przycisk myszy i przeciągniesz w lewo lub w prawo (lub w górę lub w dół, o to chodzi), zdarzenia MouseMove będą generowane przez klikniętą kontrolkę, nawet jeśli kursor myszki wyłączy się z pierwotnej kontrolki i na inną lub forma rodzica. – MusiGenesis

1

Nie można w ogóle korzystać z SplitContainer. Jedną z możliwości jest całkowite wyeliminowanie go, jeśli używasz go tylko do zmiany wielkości kontrolki. Zamiast tego można użyć zdarzeń myszy na samej kontrolce. Upuść TreeView na formularzu i zadokuj go po lewej stronie. Zapisz się na MouseDown/Move/UP wydarzenia i napisać coś takiego:

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

Znalazłem to po tym jak zobaczyłem to pytanie, więc pomyślałem, że podzielę: SplitContainer FAQ

Drugie ogniwo tam mówi dokładnie co musisz zrobić.

Oto tekst z tego, na wypadek gdyby link kiedykolwiek umarł.

//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 nie działa, [tutaj jest wersja zombie] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

Musiałem to samo i ustawić następujące właściwości:

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

nadzieję, że to pomaga.

-1

Również przyjrzeć komponentu Podział pojemnika, który pochodzi z wolnej Krypton toolkit

+0

Link nie działa. – Krythic