2010-03-06 22 views

Respuesta

29

intente configurar EstiloDeLosBordes a Fixed3D

2

Una forma sería cambiar BackColor y Width/Height las propiedades del divisor (dependiendo de la orientación del divisor)

1

A la vez que su EstiloDeLosBordes Fixed3D como @BlueMonkMN sugirió a menudo encuentro el valor de SplitterWidth predeterminado en el objeto splitContainer, de 4, es un poco estrecho.

Si sube eso a aproximadamente 6, con un borde 3D, es un poco más obvio para el usuario.

14

Puede pintar su propia barra de división agregando el siguiente controlador de eventos al evento de pintura splitcontainer.

private void SplitterPaint(object sender, PaintEventArgs e) 
{ 
    SplitContainer s = sender as SplitContainer; 
    if (s != null) { 
     int top = 5; 
     int bottom = s.Height - 5; 
     int left = s.SplitterDistance; 
     int right = left + s.SplitterWidth - 1; 
     e.Graphics.DrawLine(Pens.Silver, left, top, left, bottom); 
     e.Graphics.DrawLine(Pens.Silver, right, top, right, bottom); 
    } 
} 
+1

Esto funciona cuando el divisor está orientado verticalmente, el código podría mejorarse para trabajar independientemente de la orientación. –

+0

Sí, se puede simplificar a: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett

0

variante mejorada de la respuesta de Giles Bathgate:

private void ds_SplitContainer_Paint(object sender, PaintEventArgs e) 
{ 
    SplitContainer l_SplitContainer = sender as SplitContainer; 

    if (l_SplitContainer != null) 
    { 
     Rectangle ll_ShrinkedSplitterRectangle = l_SplitContainer.SplitterRectangle; 
     ll_ShrinkedSplitterRectangle.Offset(0, 2); 
     ll_ShrinkedSplitterRectangle.Height = ll_ShrinkedSplitterRectangle.Height - 2; 
     e.Graphics.FillRectangle(Brushes.Silver, ll_ShrinkedSplitterRectangle); 
    } 
} 
34

Esta pregunta surge porque el control SplitContainer tiene ninguna propiedad directa para seleccionar el estilo de la propia barra de separación que pueden arrastrarse.

Hay varias maneras de lograr esto, ya pesar de que las otras respuestas publicadas aquí funciona, la que quiero compartir con ustedes a continuación es en última instancia, la forma más fácil rápido, fiable y.

@BluMonkMN sugirió un método que utiliza un borde 3D, pero ¿qué sucede si no desea ningún borde?

@Giles Bathgate sugirió agregar un controlador de eventos Paint que, aunque seguramente sea elegante y funcione, tenga un pequeño costo de rendimiento y requiera agregar más código a su proyecto que ejecute en el nivel C# y que algún día pueda convertirse en un problema de mantenimiento.

@Philip Fourie sugirió cambiar el valor de la propiedad SplitContainer.BackColor; sin embargo, inicialmente hace que el fondo completo del control cambie de color, no solo la barra divisora, lo que no provoca ningún contraste de color.

Por lo tanto, mi solución es una mejora de @Philip Fourie's.

En primer lugar, mencionaré que el SplitContainer en realidad tiene dos subcontenedores distintos, ambos separados por la barra separadora. Estos dos están representados por las propiedades Panel1 y Panel2. Cada uno de ellos es esencialmente un contenedor Panel con sus propias propiedades BackColor, además de varias otras propiedades.

El SplitContainer tiene su propiaBackColor propiedad, haciendo un total de tres colores únicos posibles.

Ahora bien, si se va a establecer este SplitContainer.BackColor propiedad, los Panel1 y Panel2 "subcontroles" heredaría automáticamente que el valor de color, y ahora estarían todos de la misma, sin causar contraste visual!
Esto [probablemente indeseable] valor de la propiedad herencia sólo ocurre cuando los Panel1.BackColor y/o los Panel2.BackColor establecimientos aún no ha establecido explícitamente por usted (a pesar de que la visualización de valor de sus propiedades en la ventana de Visual Studio Propiedades antes de tiempo habría revelado "control")

Por lo tanto, el orden en que se establecen las propiedades es importante:

  1. Conjunto tanto el Panel1.BackColor y Panel2.BackColor propiedades a algo que no sea el valor por defecto de "con "niño" trol "para forzar un valor explícito (incluso si realmente quieres" Control "; lo arreglaremos más tarde.)
  2. Establezca el "padre" SplitContainer.BackColor en el color que desee que sea la barra divisora.
  3. Por último, volver atrás y ajustar los Panel1.BackColor y Panel2.BackColor propiedades al color que usted quiere que sea (tal vez de nuevo a "Control".)

Y como respondió @Philip Fourie, es posible que desee establecer el Propiedad de ancho, en realidad consistentemente llamada SplitterWidth, independientemente de la propiedad [Horizontal vs. Vertical] Orientation.

Éstos son algunos consejos útiles:

Mientras trabajaba en el diseñador de Visual Studio forma, si hace clic en el SplitContainer a ambos lados de la barra separadora, deberá seleccionar quePanel1 o Panel2 "niño" sub-contenedor. Pero si hace clic en la barra divisora, seleccionará el "padre" SplitContainer.

Y relacionado con lo que sugirió @Stuart Helwig, el valor predeterminado SplitterWidth hará que la barra divisora ​​se perfile cuando tiene foco, obscureciendo así el color que seleccionó. Aumente el valor a 5, 6, o superior, lo que también facilita que el usuario final agarre & arrastre.

Terminado. Feliz Codificación!

+3

Ooh. Creativo y simple. ¡Me gusta! – Nyerguds

+0

Esta debería ser la respuesta correcta, especialmente porque permite cambiar el color del divisor. También es muy fácil cambiar el color con este método, a pesar de la duración de la respuesta (debido a los detalles adicionales provistos) – elmer007

0

Aquí hay una implementación rápida de un divisor horizontal que se llena con un color, tiene un borde superior e inferior (similar a los divisores de Visual Studio) y puntos de agarre en el medio.

private void splitContainer_Paint(object sender, PaintEventArgs e) 
    { 
     SplitContainer s = sender as SplitContainer; 
     if (s != null) 
     { 
      int gripLineWidth = 9; 
      // Fill Splitter rectangle 
      e.Graphics.FillRectangle(SystemBrushes.ControlDark, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterWidth); 
      // Draw Single Line Border on Top and Bottom 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterDistance); 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance + s.SplitterWidth - 1, s.SplitterRectangle.Width, s.SplitterDistance + s.SplitterWidth - 1); 
      // Draw gripper dots in center 
      e.Graphics.DrawLine(_dashedPen, 
       ((s.SplitterRectangle.Width/2) - (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2, 
       ((s.SplitterRectangle.Width/2) + (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2); 
     } 
    } 

Puede crear una pluma como una variable miembro de la clase que realiza el dibujo que se dibuje una línea de puntos en su similar a:

private static Pen _dashedPen = new Pen(Color.DarkRed, 1); 
_dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
+0

¿Podría incluir el código para inicializar el lápiz rayado? –

0

establecer la propiedad BackColor del SplitContainer a diferentes color. Deje decir Negro. Entonces cada SpliterPanel, cambie su propiedad BackColor a un color diferente. Vamos a decir Blanco. Entonces notará que SplitLine se hará más visible. :)

+0

Esto es lo mismo que la respuesta de GlobalSoftwareSociety – TheLethalCoder

-1

La línea del divisor es visible en realidad. La verdadera pregunta es que es difícil distinguirlo con otros controles.

Una idea es establecer un nuevo color de fondo para el contenedor dividido y hacerlo diferente con sus paneles secundarios.

Tal vez a veces podemos resolver el problema desde la perspectiva del diseñador, no del desarrollador. :-)

+0

Esto es lo mismo que la respuesta de GlobalSoftwareSociety – TheLethalCoder

2

Puede usar SplitterColor en el diseñador para cambiar el color del borde del divisor.

public class SplitContainerCustomSplitter : SplitContainer 
{ 
    [DefaultValue(typeof(Color), "Black")] 
    public Color SplitterColor { get; set; } = Color.Black; 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     Graphics g = pevent.Graphics; 
     Rectangle rect = SplitterRectangle; 

     using (Pen pen = new Pen(SplitterColor)) 
     { 
      if (Orientation == Orientation.Vertical) 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Left, rect.Bottom - 1); 
       g.DrawLine(pen, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom - 1); 
      } 
      else 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Right - 1, rect.Top); 
       g.DrawLine(pen, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1); 
      } 
     } 
    } 
} 
0

Después de probar algunos de los métodos sugeridos aquí y no me divertida, me decidieron a poner en un panel1 y en PANEL2 una delgada etiquetas, alineados con el divisor y todo está bien.

(label's.Autosize=false, label's.Text = "", label's.Color=SystemColor.Selected, label1.Dock=left; label2.Dock=right) 
Cuestiones relacionadas