2010-04-23 14 views
5

Esistono controlli alternativi che qualcuno può suggerire di sostituire lo SplitContainer di WinForms? Non mi piace come SplitContainer mostri quella strana striscia punteggiata quando è selezionata e quando viene trascinata. Voglio ridimensionare i pannelli mentre l'utente trascina il mouse verso l'alto e non mostra alcuna striscia punteggiata quando lo splitter viene trascinato. Fondamentalmente come tutto il ridimensionamento dei pannelli è fatto in Windows Explorer su Vista.WinForms: alternativa a SplitContainer?

questa è la cosa tratteggiata sto parlando:

splitter

risposta

8

Scrivi la tua UserControl contenitore diviso. In pratica, basta semplicemente far cadere due pannelli sul controllo (per i pannelli sinistro e destro) e lasciare che lo spazio tra di essi sia lo splitter. Una piccola logica MouseDown, MouseMove e MouseUp sullo UserControl stesso ti permetterà di spostare facilmente lo "splitter" a destra e sinistra, ei due pannelli lo bloccheranno correttamente ovunque ma sopra lo splitter, quindi la tua logica per controllare se il mouse se lo splitter è il più semplice possibile.

Potrebbe essere un po 'più di lavoro ottenere il controllo di agire nel modo in cui si desidera che agisca in modalità progettazione.

+0

Beh io sto dando una prova, però, con l'evento MouseMove sul controllo, l'evento sarà smettere di sparare se il mouse viene spostato troppo velocemente e passa sopra uno dei pannelli. C'è un modo per far muovere gli eventi del mouse fino al controllo o far sì che il controllo catturi tutti gli eventi di movimento del mouse? – Telanor

+0

Non importa, ho appena collegato gli eventi MouseMove di tutti i controlli alla stessa funzione. Ha funzionato bene – Telanor

+0

Avrei dovuto elaborare che oltre a gestire gli eventi del mouse, si desidera anche un bool o qualcosa per memorizzare se il pulsante del mouse è attualmente inattivo o meno (come nella risposta di Hans). Se si fa clic e si tiene premuto il pulsante del mouse su un controllo, verrà generato un evento MouseDown su tale controllo. Se tieni premuto il pulsante del mouse e trascini verso sinistra o verso destra (o verso l'alto o verso il basso, per quel motivo), gli eventi MouseMove verranno generati dal controllo su cui hai fatto clic, anche se il cursore del mouse si spegne dal controllo originale e su un altro o la forma genitore. – MusiGenesis

1

Non è possibile armeggiare con SplitContainer. Una possibilità è eliminarla completamente se la si utilizza solo per ridimensionare un controllo. È possibile utilizzare invece gli eventi del mouse sul controllo stesso. Rilasciare un TreeView su un modulo e collegarlo a sinistra. Iscriviti al MouseDown/Sposta eventi/Su e scrivere qualcosa del genere:

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

Ho trovato questo dopo che ho visto la tua domanda, così ho pensato di condividere: SplitContainer FAQ

Il secondo link in là dice esattamente cosa devi fare.

Ecco il testo da quello nel caso in cui il collegamento muoia mai.

//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 è morto, [ecco la versione zombie] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

avevo bisogno lo stesso e impostare le seguenti proprietà:

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

Spero che questo aiuti.

-1

Inoltre, dare un'occhiata al componente contenitore di scissione che viene fornito con la libera Krypton toolkit

+0

Il link è morto. – Krythic