2010-04-23 6 views
5

Y a-t-il d'autres contrôles que quelqu'un peut suggérer pour remplacer le WinForms SplitContainer? Je n'aime pas comment le SplitContainer montre cette bande bizarre, en pointillé quand elle est sélectionnée et quand elle est traînée. Je souhaite que les panneaux soient redimensionnés au fur et à mesure que l'utilisateur glisse à la place de la souris et ne montre aucune bande pointillée lorsque le séparateur est déplacé. Fondamentalement comme comment tout le redimensionnement des panneaux est fait dans Windows Explorer sur Vista.WinForms: Alternative à SplitContainer?

C'est la chose en pointillé dont je parle:

splitter

Répondre

8

Écrivez votre propre UserControl conteneur fendu. Vous bascule simplement deux panneaux sur le contrôle (pour les panneaux de gauche et de droite) et laissez l'espace entre eux être le séparateur. Un peu MouseDown, MouseMove et logique MouseUp sur le UserControl lui-même vous permettra de déplacer facilement le « séparateur » à gauche et à droite, et les deux panneaux bloque correctement ce partout, mais sur le séparateur, de sorte que votre logique pour vérifier si la souris si sur la Le séparateur est aussi simple que possible.

Il est peut-être un peu de travail supplémentaire obtenir le contrôle d'agir comme vous le voulez agir en mode de conception.

+0

Eh bien, je vais donner à ce essayer, cependant, avec l'événement MouseMove sur le contrôle, l'événement s'arrêtera le tir si la souris est déplacé trop vite et il va sur l'un des panneaux. Existe-t-il un moyen de faire bouger les événements de la souris vers le contrôle ou faire en sorte que le contrôle capture tous les événements de déplacement de la souris? – Telanor

+0

Peu importe, je viens d'accrocher les événements MouseMove de tous les contrôles à la même fonction. Il a bien – Telanor

+0

j'ai expliqué que, en plus de traiter les événements de souris, vous voulez aussi un bool ou quelque chose pour stocker si le bouton de la souris est actuellement en panne ou non (comme dans la réponse de Hans). Si vous cliquez et maintenez le bouton de la souris sur un contrôle, il générera un événement MouseDown sur ce contrôle. Si vous maintenez le bouton de la souris enfoncé et faites glisser à gauche ou à droite (vers le haut ou vers le bas, d'ailleurs), les événements MouseMove seront tous générés par le contrôle que vous cliquez dessus, même si le curseur de la souris se déclenche le contrôle d'origine et sur un autre ou le formulaire parent. – MusiGenesis

1

Vous ne pouvez pas bricoler avec SplitContainer du tout. Une possibilité est de l'éliminer complètement si vous ne l'utilisez que pour redimensionner un contrôle. Vous pouvez utiliser des événements de souris sur le contrôle lui-même à la place. Déposez un TreeView sur un formulaire et ancrez-le sur la gauche. Abonnez-vous à la MouseDown/Déplacer/Up événements et écrire quelque chose comme ceci:

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

J'ai trouvé après avoir vu votre question, donc pensé que je partagerais: SplitContainer FAQ

Le second lien là-bas dit exactement Qu'as tu besoin de faire.

Voici le texte de ce juste au cas où le lien meurt jamais.

//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

Lien est mort, [voici la version zombie] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

je besoin même et définissez les propriétés suivantes:

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

Hope this helps.

-1

Aussi, jetez un oeil à l'élément de conteneur fendu qui est livré avec la libre Krypton toolkit

+0

Le lien est mort. – Krythic