2017-11-11 205 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; } 
     } 
    } 
}