【问题标题】:Prevent showing border of a disabled menu item on mouse hover防止在鼠标悬停时显示禁用菜单项的边框
【发布时间】:2017-11-11 17:51:45
【问题描述】:

当我将鼠标悬停在 ToolStripMenuItem 上时,即使它被禁用,它也会在其周围显示一个边框。有什么属性可以删除吗?

我已经查找了 HoverBorder 之类的属性,但没有找到任何有用的东西。

【问题讨论】:

    标签: c# .net winforms toolstrip menustrip


    【解决方案1】:

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

    要使启用的菜单项的边框仅可见,您可以创建自定义ProfessionalColorTable 和自定义ToolStripProfessionalRenderer,并添加一个新的MenuItemEnabledBorder 返回默认边框颜色,并覆盖MenuItemBorder 以返回@ 987654330@.

    然后在您的自定义渲染器中,覆盖 OnRenderMenuItemBackground 并在项目为 highlighetd 时使用 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();
    

    【讨论】:

      【解决方案2】:

      您可以覆盖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; }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 2016-07-18
        • 1970-01-01
        • 2019-11-09
        相关资源
        最近更新 更多