如何在单击菜单项时突出显示活动菜单项?

3
我正在使用C# WinForms开发桌面应用程序。我已经使用menustrip来在不同的面板之间导航。我遇到的问题是我无法突出显示menustrip图标的活动颜色。一个图示描述将更好地解释我想要实现的内容。
这是我的菜单条。

enter image description here

当单击 MenuStripItem 时,我希望实现这个功能

enter image description here

简而言之,我希望菜单栏项在我点击它时保持高亮,就像图片中的“搜索和编辑”一样,之后如果我点击“新客户”,则必须将其突出显示为“搜索和编辑”。请保留HTML标签。

1
可能是更改Winforms菜单下拉列表的边框颜色的重复问题。 - Ňɏssa Pøngjǣrdenlarp
使用 ToolStrip 是否是更好的选择?然后,您可以将切换按钮添加到 ToolStrip 上,并将对应于活动面板的按钮设置为“已选中”。 - erdomke
3个回答

2

您可以使用ToolStrip,并将项的Checked属性设置为true。为此,您可以处理ToolStripItemClicked事件,并以以下方式检查项目:

private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    foreach (ToolStripButton item in ((ToolStrip)sender).Items)
    {
        if (item != e.ClickedItem)
            item.Checked = false;
        else
            item.Checked = true;
    }
}

这样可以在选中项周围显示边框。如果由于任何原因您对外观不满意,您可以通过创建自定义渲染器并将其分配为ToolStrip的渲染器来定制选中项的外观:

public class MyRenderer : ToolStripProfessionalRenderer
{
    public MyRenderer() : base(new MyColorTable())
    {
    }
}

public class MyColorTable : ProfessionalColorTable
{
    public override Color ButtonCheckedGradientBegin
    {
        get { return ButtonPressedGradientBegin; }
    }
    public override Color ButtonCheckedGradientEnd
    {
        get { return ButtonPressedGradientEnd; }
    }
    public override Color ButtonCheckedGradientMiddle
    {
        get { return ButtonPressedGradientMiddle; }
    }
}

在窗体的构造函数中初始化组件后,在Load事件中分配渲染器,代码如下:
toolStrip1.Renderer = new MyRenderer();

这样做可以将选中的项目显示为高亮。


谢谢你,这对我帮助很大。最好使用ToolStrip而不是MenuStrip。谢谢。 - Ezaz

0

设置MenuStrip上被点击项的背景颜色如下:

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    foreach (ToolStripMenuItem item in ((ToolStrip)sender).Items)
    {
        if (item != e.ClickedItem)
            item.BackColor = Color.White;
        else
            item.BackColor = Color.Cyan;
    }
}

0
所选项目可以在 Paint 上进行更改(不确定是否存在更合适的事件):
public Form1()
{
    InitializeComponent();

    ToolStripItem activeToolStripItem = null;
    menuStrip1.Paint += (o, e) => activeToolStripItem?.Select();
    menuStrip1.ItemClicked += (o, e) => activeToolStripItem = e.ClickedItem;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接