2017-11-11 126 views
1

当我将鼠标悬停在ToolStripMenuItem上时,即使它被禁用,也会在其周围显示边框。有没有任何财产去除这个?防止悬停边框

我在寻找属性,如HoverBorder,但还没有找到任何有用的东西。

回答

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

+0

完美的作品!还有可爱的GIF;) –

+0

不客气;) –

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