为不同的 ToolStripMenuItems 使用不同的高亮颜色

Use different Highlight color for different ToolStripMenuItems

下拉菜单中有一个 ToolStripMenuItem 对象包含其他 3 个 ToolStripMenuItem。我想在不同 ToolStripMenuItems 的 MouseHover 上使用不同的高亮颜色。说,是的 - 绿色。对于否 - 红色。对于 MayBe - 蓝色。当我在不同的项目之间移动时,突出显示的颜色应该相应地改变。请帮忙。

P.S。 - MouseEnter、MouseLeave、MouseHover 事件不起作用,因为它们在 ToolStripMenuItems 上起作用,Highlighter.

就是这种情况

当您使用 ToolStripProfessionalRenderer 时,更改背景颜色不会更改突出显示颜色。此外,虽然您的工具条使用单个渲染器,但由于渲染器使用渲染器的 MenuItemSelectedColor 属性 of ProfessionalColorTable,因此它无法根据条件渲染突出显示颜色。

您可以动态更改 ToolStrip 的渲染器并将其渲染器设置为以所需颜色绘制高光的渲染器。

以下是我使用的步骤:

(1)ToolStripRenderMode 设置为 ManagerRenderMode:

this.toolStrip1.RenderMode = ToolStripRenderMode.ManagerRenderMode;

(2) 创建自定义颜色 table,您可以将 MenuItemSelectedColor 传递给它:

public class MyColorTable : ProfessionalColorTable
{
    private Color menuItemSelectedColor;
    public MyColorTable(Color color): base()
    {
        menuItemSelectedColor = color;
    }
    public override Color MenuItemSelected
    {
        get { return menuItemSelectedColor; }
    }
}

(3) 在表单级别定义您需要的渲染器:

ToolStripProfessionalRenderer r = 
    new ToolStripProfessionalRenderer(new MyColorTable(Color.Red));
ToolStripProfessionalRenderer g = 
    new ToolStripProfessionalRenderer(new MyColorTable(Color.Green));
ToolStripProfessionalRenderer b = 
    new ToolStripProfessionalRenderer(new MyColorTable(Color.Blue));

(4) 为您要使用自定义渲染器的所有菜单项处理 MouseEnterMouseLeave 事件,并将此处理程序分配给所有他们:

private void menuItem_MouseEnter(object sender, EventArgs e)
{
    var item = (ToolStripMenuItem)sender;
    if (item.Text == "Yes")
        ToolStripManager.Renderer = g;
    else if (item.Text == "No")
        ToolStripManager.Renderer = r;
    else if (item.Text == "MayBe")
        ToolStripManager.Renderer = b;
    else
        ToolStripManager.Renderer = null; // or use your default renderer
}

private void menuItem_MouseLeave(object sender, EventArgs e)
{
    ToolStripManager.Renderer = null; // or use your default renderer
}