防止在鼠标悬停时显示禁用菜单项的边框

时间:2017-11-11 17:51:46

标签: c# .net winforms toolstrip menustrip

当我将鼠标悬停在ToolStripMenuItem上时,即使它被禁用,它也会在其周围显示边框。是否有任何财产可以删除?

我查找过HoverBorder等属性但未找到任何用途。

2 个答案:

答案 0 :(得分:1)

ToolStripProfessionalRenderer默认使用MenuItemBorder ProfessionalColorTable属性绘制边框。

要使启用的菜单项只显示边框,您可以创建自定义ProfessionalColorTable和自定义ToolStripProfessionalRenderer并添加新的MenuItemEnabledBorder,返回默认边框颜色,并覆盖MenuItemBorder返回Color.Transparent

然后在您的自定义渲染器中,当项目为highlighetd时,覆盖OnRenderMenuItemBackground并使用MenuItemEnabledBorder绘制边框就足够了。

<强>代码

public class MyColorTable : ProfessionalColorTable
{
    public override Color MenuItemBorder { get { return Color.Transparent; } }
    public Color MenuItemEnabledBorder { get { return base.MenuItemBorder; } }
}

public class MyRenderer : ToolStripProfessionalRenderer
{
    public MyRenderer() : base(new MyColorTable()) { }
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
    {
        base.OnRenderMenuItemBackground(e);
        if (e.Item.Enabled && e.Item.Selected)
        {
            using (var pen = new Pen(((MyColorTable)ColorTable).MenuItemEnabledBorder))
            {
                var r = new Rectangle(2, 0, e.Item.Width - 4, e.Item.Height - 1);
                e.Graphics.DrawRectangle(pen, r);
            }
        }
    }
}

然后使用渲染器,将其设置为工具条的渲染器就足够了:

this.toolStrip1.Renderer = new MyRenderer();

enter image description here

答案 1 :(得分:1)

您可以覆盖ToolStripProfessionalRenderer类并将颜色(如果您不希望边框传递原始BackColor)传递给其基类构造函数:

namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            menuStrip1.Renderer = new CustomColors();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }

    private class CustomColors : ToolStripProfessionalRenderer
    {
        public CustomColors() : base(new MyColors()) { }
    }

    private class MyColors : ProfessionalColorTable
    {
        public override Color MenuItemSelected
        {
            get { return Color.GreenYellow; }
        }
        public override Color MenuItemSelectedGradientBegin
        {
            get { return Color.DarkBlue; }
        }
        public override Color MenuItemSelectedGradientEnd
        {
            get { return Color.Yellow; }
        }
    }
}