如何在Winform C#中禁用工具栏下的线?

15

alt text

这一行是什么意思?


你是如何将背景变为白色的?那不是标准设置。 - Hans Passant
4个回答

56

"system" 渲染器中存在一个bug,详情请参见此错误报告

微软的回复提供了一种非常简单的解决方法:

1)创建ToolStripSystemRenderer的子类,重写OnRenderToolStripBorder并将其设置为无操作:

public class MySR : ToolStripSystemRenderer
{
    public MySR() { }

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

2)使用该渲染器来处理你的工具栏。在将工具栏的RenderMode属性分配给任何内容,必须分配该渲染器;否则会被覆盖为一个对System.Windows.Forms渲染器的引用。

toolStrip3.Renderer = new MySR();

9
+1,但我已经编辑了答案,确实包含了答案而不仅仅是指向它。StackOverflow应该是独立的,外部链接可能会失效。它们可以作为很好的补充,但主要内容应该在SO本身上。 - T.J. Crowder
为什么这会关闭我的应用程序? - RickInWestPalmBeach

12

您可能希望添加类型检查以避免在ToolStripDropDownMenu/等控件上丢失边框。(由于继承自ToolStrip,它会自动启用相同的自定义渲染器):

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
    if (e.ToolStrip.GetType() == typeof(ToolStrip))
    { 
        // skip render border
    }
    else
    {
        // do render border
        base.OnRenderToolStripBorder(e);
    }
}

使用 ToolStripSystemRenderer 时,错过了 ToolStripDropDownMenu 边框不是很明显,但在使用 ToolStripProfessionalRenderer 时会变得非常刺眼。

此外,如果您希望应用程序中所有的 ToolStrip 实例默认使用 MySR,则可以设置 System.Windows.Forms.ToolStripManager.Renderer = new MySR();


2

这个类比其他类更加完整!

public class ToolStripRender : ToolStripProfessionalRenderer
{
    public ToolStripRender() : base() { }

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        if (!(e.ToolStrip is ToolStrip))
            base.OnRenderToolStripBorder(e);
    }
}

1

针对仅隐藏工具栏边框而不是下拉菜单边框的建议解决方案无效。

以下是解决方法:

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
    {
        //if (!(e.ToolStrip is ToolStrip)) base.OnRenderToolStripBorder(e); - does not work!
        if (e.ConnectedArea.Width != 0) base.OnRenderToolStripBorder(e);
    } 

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