2010-04-23 22 views
5

¿Hay algún control alternativo que alguien pueda sugerir para reemplazar el SplitContainer de WinForms? No me gusta cómo SplitContainer muestra esa tira extraña y punteada cuando se selecciona y cuando se arrastra. Quiero que los paneles cambien de tamaño a medida que el usuario arrastra en lugar de mover el mouse hacia arriba y no muestra ninguna tira punteada cuando se está arrastrando el divisor. Básicamente, como se hace todo el redimensionamiento de paneles en Windows Explorer en Vista.WinForms: ¿alternativa a SplitContainer?

Esto es lo punteada que estoy hablando:

splitter

Respuesta

8

Escribe tu propia UserControl recipiente dividido. Básicamente, solo deja caer dos paneles en el control (para los paneles izquierdo y derecho) y luego deja que el espacio entre ellos sea el divisor. Una pequeña lógica MouseDown, MouseMove y MouseUp en el UserControl le permitirá mover fácilmente el "divisor" hacia la izquierda y hacia la derecha, y los dos paneles bloquearán esto en todas partes pero sobre el divisor, de modo que su lógica para verificar si el mouse está sobre el El divisor es tan simple como puede ser.

Puede ser un poco más de trabajo conseguir que el control actúe de la manera que usted desea que actúe en modo de diseño.

+0

Bueno, yo estoy dando a este un intento, sin embargo, con el evento MouseMove del control, el evento será dejar de disparar si el ratón se mueve demasiado rápido y pasa por uno de los paneles. ¿Hay alguna manera de hacer que los eventos de movimiento del mouse pasen al control o que el control capte todos los eventos de movimiento del mouse? – Telanor

+0

No importa, acabo de conectar los eventos MouseMove de todos los controles a la misma función. Funcionó bien – Telanor

+0

Debería haber explicado que, además de manejar los eventos del mouse, también quieres un bool o algo para almacenar si el botón del mouse está actualmente inactivo o no (como en la respuesta de Hans). Si hace clic y mantiene presionado el botón del mouse en un control, generará un evento MouseDown en ese control. Si mantiene presionado el botón del mouse y arrastra hacia la izquierda o hacia la derecha (o hacia arriba o hacia abajo, para el caso), los eventos de MouseMove serán generados por el control que hizo clic, incluso si el cursor del mouse desactivó el control original y la forma parental – MusiGenesis

1

No se puede jugar con SplitContainer en absoluto. Una posibilidad es eliminarlo por completo si solo lo está usando para cambiar el tamaño de un control. Podría usar eventos de mouse en el control en su lugar. Coloque un TreeView en un formulario y acoplarlo a la izquierda. Suscribirse a la MouseDown/Mover/hasta eventos y escribir algo como esto:

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

encontré esto después de que vi tu pregunta, así que pensé que iba a compartir: SplitContainer FAQ

El segundo enlace en no dice exactamente Qué necesitas hacer.

Aquí está el texto de eso en caso de que el enlace muera alguna vez.

//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 está muerto, [aquí está la versión zombie] (http://web.archive.org/web/20111122002109/http://windowsclient.net/blogs/faqs/archive/tags/SplitContainer/default.aspx). –

1

que necesita la misma y establezca las siguientes propiedades:

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

Espero que esto ayude.

-1

También, echar un vistazo a la componente de contenedor de división que viene con la libre Krypton toolkit

+0

El enlace está muerto. – Krythic