如何在WinForms应用程序中创建一条线?

20

我希望在WinForms应用程序中创建一个简单的3D线条,以改善我的表单布局的视觉排列。

这条线与“关于Windows”对话框中的线条完全相同(可以在Windows资源管理器中打开->帮助->关于 Windows)。

以下是示例图片:

about

我想要的是最后一行(3D),而不是第一行。

如何在C#或Visual Basic (.NET)中实现这个效果?


请使用Imgur来托管图片,因为它被[编辑]功能支持。另外请注意,除了stack.imgur.com之外的其他主机可能会被许多组织屏蔽。 - John Alexiou
6个回答

63

添加一个具有3D边框且没有文本的标签(Label)控件, 然后将高度设置为2。

var separator = new Label();
separator.BorderStyle = BorderStyle.Fixed3D;
separator.Height = 2;

9
如果您使用SysInternals的ZoomIt实用程序,您会发现这只是两条线。一条深灰色线在上面,一条白色线在下面。使用Graphics.DrawLine()绘制线条非常简单,您只需要确保选择一种与窗体的BackColor相匹配的深色即可。如果用户选择了其他主题,则通常不是深灰色。这使得GroupBox技巧不起作用。
以下是样本代码:
    protected override void OnPaint(PaintEventArgs e) {
        Color back = this.BackColor;
        Color dark = Color.FromArgb(back.R >> 1, back.G >> 1, back.B >> 1);
        int y = button1.Bottom + 20;
        using (var pen = new Pen(dark)) {
            e.Graphics.DrawLine(pen, 30, y, this.ClientSize.Width - 30, y);
        }
        e.Graphics.DrawLine(Pens.White, 30, y+1, this.ClientSize.Width - 30, y+1);
    }

请注意此代码中使用了button1,以确保在表单重新缩放时,线条绘制在正确的高度。选择您自己的控件作为线条的参考。

4
我也使用过GroupBox hack,它可以根据操作系统边框主题自动设置样式。 VB Power Packs控件集合中还有一个Line类。我们也使用了其中的一些其他好东西。 编辑:这是我的Seperator类,使用上述方法绘制水平线。
public class Separator : GroupBox
{
    // Methods
    protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
    {
        base.SetBoundsCore(x, y, width, 3, specified);
    }

    // Properties
    [DefaultValue("")]
    public override string Text
    {
        get
        {
            return string.Empty;
        }
        set
        {
        }
    }
}

4

一种方法是创建一个没有标签且高度为0(或者是1,我记不太清了)的分组框 - 我知道我以前用过这个技巧,即使感觉有点hacky :-)


1
嗨@Tor,我曾经尝试过这个方法,但如果用户在Windows中使用皮肤,这可能会使行看起来非常奇怪!!!我正在寻找这种技术的替代方案。 - RHaguiuda

3

您可以通过添加标签并将其文本设置为下划线 "_" 来获得分隔符效果。


0

我为此编写了一个自定义控件。您可以从NuGet安装控件套件:

Install-Package ALMSTWKND -Version 1.0.0

安装完成后,它将被添加到工具箱窗格中。


这基本上是一个仅包含URL的答案,被视为低质量帖子,并可能被删除。请添加更多细节和摘要以帮助其他用户。 - John Alexiou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接