Glo*_*ety 54
出现这个问题是因为SplitContainer
控件没有直接属性来设置可拖动分割条本身的样式.
有几种方法可以实现这一点,即使这里发布的其他答案有效,我在下面与您分享的答案最终也是快速,可靠和最简单的方法.
@BluMonkMN建议使用3D边框的方法,但是如果你不想要任何边框呢?
@Giles Bathgate建议添加一个Paint事件处理程序,即使它确实很优雅并且确实有效,但是需要稍微降低性能,要求您在C#级别执行的项目中添加更多代码,并且有一天可能成为维护问题.
@Philip Fourie建议改变SplitContainer.BackColor
房产价值; 但是,最初会导致控件的整个背景改变颜色,而不仅仅是分割条,不会产生颜色对比.
所以,我的解决方案是@Philip Fourie的增强功能.
首先,我要提到的是,它SplitContainer
实际上有两个不同的子容器,两者都由分离器条隔开.这两个由Panel1
和Panel2
属性表示.BackColor
除了其他几个属性之外,它们中的每一个本质上都是一个具有自己属性的Panel容器.
该SplitContainer
有它自己的BackColor
特性,使一共有三个唯一可能的颜色.
现在,如果你要设置该SplitContainer.BackColor
属性,则Panel1
和Panel2
"子控件"将自动继承颜色值,而现在他们全是一样的,没有造成视觉反差!
这种[可能不合需要的]属性值继承仅在您尚未显式设置Panel1.BackColor
和/或Panel2.BackColor
属性时发生(即使提前在Visual Studio属性窗口中查看其属性值会显示"控制".)
因此,您设置属性的顺序很重要:
Panel1.BackColor
和Panel2.BackColor
属性设置为默认值"Control" 以外的其他值以强制显式值(即使您确实需要"Control";我们稍后会修复它.)SplitContainer.BackColor
您希望分割条所需的颜色.Panel1.BackColor
和Panel2.BackColor
属性设置为您希望它们的颜色(可能返回"Control".)正如@Philip Fourie回答的那样SplitterWidth
,无论[水平与垂直] Orientation
属性如何,您可能希望设置Width属性,实际上始终如一.
以下是一些有用的提示:
在Visual Studio窗体设计器中工作时,如果单击SplitContainer
拆分器栏的两侧,则将选择该 子容器Panel1
或Panel2
"子"子容器.但是如果你单击分割条本身,你将选择"父" SplitContainer
.
与@Stuart Helwig建议的相关,默认情况下SplitterWidth
会导致分割条在焦点处被勾勒出轮廓,从而遮挡您选择的颜色.将值提高到5
,6
或更高,这也使最终用户更容易抓取和拖动.
成品.快乐的编码!
小智 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)
您可以在设计器中使用 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)