如何去除MenuStrip控件下的白色线条?

8
我阅读了一些关于人们如何想要自定义MenuStrip的颜色和渐变的文章。
我想要做的是去掉渐变,使MenuStrip与表单的其他部分颜色相同,对我来说,这是创建新的WinForms项目时使用的默认设置。我尝试将RenderMode更改为“System”,它有点奏效,但是在构建和运行时会留下一条与MenuStrip长度相同的白线。我需要进行一些绘画吗?还是有更简单的方法?
3个回答

9
这基本上是与此相同的问题
答案引用了这个Microsoft bug post
从2005年开始,这似乎一直是一个问题。尽管评论说这是微软的一个错误,不会被修复,但有一个解决方法,涉及实现自己的渲染器:
public class MySR : ToolStripSystemRenderer
{
    public MySR()
    {
    }

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        //base.OnRenderToolStripBorder(e);
    }
}

那么,您需要做的就是将您的菜单条的渲染器设置为您刚刚实现的渲染器:

menustrip1.Renderer = new MySR();

我刚试了一下,似乎运行良好。


1
确实是一个重复的问题,但是你在这里的答案更好。主要是因为你花时间复制并粘贴了解决方法的代码。 - Cody Gray
1
微软公司这个漏洞已经存在了将近6年,2个版本后仍未修复,真是毫无用处!谢谢你的回答Yetti,我很感激。 - BrandNewDev

3

我同意 Yetti 的观点,但如果您希望保持边框,您可以尝试以下方法。将 Brush 替换为您的背景颜色。

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
  base.OnRenderToolStripBorder(e);
  e.Graphics.FillRectangle(Brushes.Black, e.ConnectedArea);
}

3
在您的示例中,您可以只使用 Brushes.Black 而不是创建一个新的黑色画刷,因为您没有在示例中对其进行处理。 - LarsTech
谢谢。我不知道你可以这样做。我编辑了上面的答案。 - General Grey

0
@ Yetti的回答是正确的,但有一个小问题。它还会移除菜单下拉部分的边框(即在点击项目时打开的部分)。为了避免这种情况,请在OnRenderToolStripBorder中执行以下操作:
public class MySR : ToolStripSystemRenderer
{
    public MySR()
    {
    }
    
    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        if (e.AffectedBounds == e.ToolStrip.Bounds) return;
        base.OnRenderToolStripBorder(e);
    }
}

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