¿Cómo puedo hacer que el divisor de paneles divididos sea visible para el usuario, en lugar de ser invisible con solo un cambio de cursor al pasar el mouse sobre él?Hacer que el divisor sea visible para el Panel dividido
Respuesta
intente configurar EstiloDeLosBordes a Fixed3D
Una forma sería cambiar BackColor
y Width/Height
las propiedades del divisor (dependiendo de la orientación del divisor)
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.
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);
}
}
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);
}
}
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:
- Conjunto tanto el
Panel1.BackColor
yPanel2.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.) - Establezca el "padre"
SplitContainer.BackColor
en el color que desee que sea la barra divisora. - Por último, volver atrás y ajustar los
Panel1.BackColor
yPanel2.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!
Ooh. Creativo y simple. ¡Me gusta! – Nyerguds
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
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;
¿Podría incluir el código para inicializar el lápiz rayado? –
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. :)
Esto es lo mismo que la respuesta de GlobalSoftwareSociety – TheLethalCoder
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. :-)
Esto es lo mismo que la respuesta de GlobalSoftwareSociety – TheLethalCoder
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);
}
}
}
}
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)
- 1. Objeto gui de panel dividido
- 2. Desplácese UITableView para que el encabezado no sea visible
- 3. ¿Configurar nodo para que sea visible externamente?
- 4. cómo hacer que la etiqueta sea visible/invisible?
- 5. ¿Mantiene el ancho fijo del panel de un contenedor dividido?
- 6. Altura del panel fijo en un contenedor dividido
- 7. asegúrese de que el título sea completamente visible en JOptionPane
- 8. ¿Cómo reorganizo un panel dividido en Emacs?
- 9. cambiar el índice z de marcador al colocar el cursor sobre él para hacer que sea visible
- 10. Cómo hacer que el botón sea transparente en mi aplicación aún visible
- 11. ¿Cómo hacer que la forma sea transparente mientras se mantiene el componente visible?
- 12. ¿Cómo puedo hacer que este JButton sea visible? Cuando tengo el fondo de exploración progresiva JWindow()?
- 13. ¿Cómo hacer que el archivo sea escaso?
- 14. Haga que el divisor de un NSSplitView sea indpendible y no muestre el cursor de arrastre
- 15. ¿Puedo hacer que el comportamiento de control sea el mismo para ZSH que para Bash?
- 16. Extjs - force panel/grid para que sea 100% altura
- 17. Cómo hacer que PictureBox sea desplazable
- 18. ¿Cómo hacer que EditText sea más pequeño que el predeterminado?
- 19. C#: El panel anclado no cambiará el tamaño correctamente
- 20. Android: ¿Cómo hacer que el teclado siempre esté visible?
- 21. Haga que el ActionBar dividido muestre el doble de iconos
- 22. ¿Puedo hacer que un TTreeNode sea invisible?
- 23. iTerm2 - ocultar las barras de título del panel dividido?
- 24. ¿Puede el validador personalizado hacer que un campo sea opcional?
- 25. ¿Cómo hacer que el programa Java sea instalable?
- 26. ¿Cómo hacer que el automake sea menos feo?
- 27. C# - Cómo hacer que un método solo sea visible para las clases que heredan la clase base del método
- 28. ¿Cómo hacer que el botón no sea transparente?
- 29. cómo hacer que el programa sea capaz de instalar
- 30. Eclipse: hacer que el corchete sea más notable
Esto funciona cuando el divisor está orientado verticalmente, el código podría mejorarse para trabajar independientemente de la orientación. –
Sí, se puede simplificar a: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett