防止在鼠标悬停时显示禁用菜单项的边框
Prevent showing border of a disabled menu item on mouse hover
当我将鼠标悬停在 ToolStripMenuItem
上时,即使它被禁用,它也会在其周围显示一个边框。有没有属性删除这个?
我寻找过 Hover
或 Border
等属性,但没有找到任何有用的东西。
ToolStripProfessionalRenderer
默认使用ProfessionalColorTable
的MenuItemBorder
属性绘制边框。
要使启用的菜单项的边框仅可见,您可以创建自定义 ProfessionalColorTable
和自定义 ToolStripProfessionalRenderer
并添加新的 MenuItemEnabledBorder
returning默认边框颜色,并且还将 MenuItemBorder
覆盖为 return Color.Transparent
.
然后在您的自定义渲染器中,覆盖 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();
您可以重写 ToolStripProfessionalRenderer
class 并将您的颜色(如果您不想让边框传递原始背景颜色)传递给它的基础 class 构造函数:
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; }
}
}
}
当我将鼠标悬停在 ToolStripMenuItem
上时,即使它被禁用,它也会在其周围显示一个边框。有没有属性删除这个?
我寻找过 Hover
或 Border
等属性,但没有找到任何有用的东西。
ToolStripProfessionalRenderer
默认使用ProfessionalColorTable
的MenuItemBorder
属性绘制边框。
要使启用的菜单项的边框仅可见,您可以创建自定义 ProfessionalColorTable
和自定义 ToolStripProfessionalRenderer
并添加新的 MenuItemEnabledBorder
returning默认边框颜色,并且还将 MenuItemBorder
覆盖为 return Color.Transparent
.
然后在您的自定义渲染器中,覆盖 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();
您可以重写 ToolStripProfessionalRenderer
class 并将您的颜色(如果您不想让边框传递原始背景颜色)传递给它的基础 class 构造函数:
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; }
}
}
}