使拆分器对拆分面板可见

Sam*_*Sam 41 .net c# winforms

如何使用户可以看到拆分面板拆分器,而不是只在鼠标悬停时光标发生变化而不可见?

Glo*_*ety 54

出现这个问题是因为SplitContainer控件没有直接属性来设置可拖动分割条本身的样式.

有几种方法可以实现这一点,即使这里发布的其他答案有效,我在下面与您分享的答案最终也是快速,可靠和最简单的方法.

@BluMonkMN建议使用3D边框的方法,但是如果你不想要任何边框呢?

@Giles Bathgate建议添加一个Paint事件处理程序,即使它确实很优雅并且确实有效,但是需要稍微降低性能,要求您在C#级别执行的项目中添加更多代码,并且有一天可能成为维护问题.

@Philip Fourie建议改变SplitContainer.BackColor房产价值; 但是,最初会导致控件的整个背景改变颜色,而不仅仅是分割条,不会产生颜色对比.

所以,我的解决方案是@Philip Fourie的增强功能.

首先,我要提到的是,它SplitContainer实际上有两个不同的子容器,两者都由分离器条隔开.这两个由Panel1Panel2属性表示.BackColor除了其他几个属性之外,它们中的每一个本质上都是一个具有自己属性的Panel容器.

SplitContainer自己的BackColor特性,使一共有三个唯一可能的颜色.

现在,如果你要设置该SplitContainer.BackColor属性,则Panel1Panel2"子控件"将自动继承颜色值,而现在他们全是一样的,没有造成视觉反差!
这种[可能不合需要的]属性值继承仅在您尚未显式设置Panel1.BackColor和/或Panel2.BackColor属性时发生(即使提前在Visual Studio属性窗口中查看其属性值会显示"控制".)

因此,您设置属性的顺序很重要:

  1. 将"child" Panel1.BackColorPanel2.BackColor属性设置为默认值"Control" 以外其他值以强制显式值(即使您确实需要"Control";我们稍后会修复它.)
  2. 将"父"设置为SplitContainer.BackColor您希望分割条所需的颜色.
  3. 最后,返回并将Panel1.BackColorPanel2.BackColor属性设置为您希望它们的颜色(可能返回"Control".)

正如@Philip Fourie回答的那样SplitterWidth,无论[水平与垂直] Orientation属性如何,您可能希望设置Width属性,实际上始终如一.

以下是一些有用的提示:

在Visual Studio窗体设计器中工作时,如果单击SplitContainer拆分器栏的两侧,则将选择 子容器Panel1Panel2"子"子容器.但是如果你单击分割条本身,你将选择"父" SplitContainer.

与@Stuart Helwig建议的相关,默认情况下SplitterWidth会导致分割条在焦点处被勾勒出轮廓,从而遮挡您选择的颜色.将值提高到5,6或更高,这也使最终用户更容易抓取和拖动.

成品.快乐的编码!

  • 哦.有创意,简单.我喜欢! (4认同)
  • 这应该是正确的答案,特别是因为它允许改变分离器的颜色.尽管答案有多长(由于提供了额外的细节),使用这种方法更改颜色也非常容易 (2认同)

Blu*_*kMN 39

尝试将BorderStyle设置为Fixed3D


小智 17

您可以通过将以下事件处理程序添加到splitcontainer paint事件来绘制自己的拆分器栏.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,它可以简化为:`e.Graphics.FillRectangle(Brushes.LightGray,s.SplitterRectangle);` (2认同)

Jae*_*aex 6

您可以在设计器中使用 SplitterColor 来更改拆分器边框颜色。

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)