winforms 如何在winform c#中禁用工具条下的行?

w3nuxt5m  于 2023-04-07  发布在  C#
关注(0)|答案(4)|浏览(148)

这条线?

9cbw7uwe

9cbw7uwe1#

这是“系统”渲染器中的一个错误,详细信息在this bug report中。
微软的回应提供了一个非常简单的解决方案:
1)创建ToolStripSystemRenderer的子类,覆盖OnRenderToolStripBorder并使其成为无操作:

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

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

2)将该渲染器用于toolstrip。该渲染器必须在 * 对toolstrip的RenderMode属性进行任何赋值 * 之后赋值,否则它将被对System.Windows.Forms渲染器的引用覆盖。

toolStrip3.Renderer = new MySR();
ax6ht2ek

ax6ht2ek2#

您可能需要添加类型检查,以避免在ToolStripDropDownMenu/etc上丢失边框(由于继承自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();可能很有用。

e4eetjau

e4eetjau3#

这门课比其他课更完整!

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

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

mccptt674#

建议的只隐藏工具条边框而不隐藏下拉菜单边框的解决方案不起作用。
这就是诀窍所在:

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);
    }

相关问题