MenuItem的“取消选择”事件

时间:2011-11-29 15:09:36

标签: c# winforms

当用户将鼠标悬停在菜单项上时,我正在尝试实施“预览”方案。

例如,假设一个程序有一个带有“Set Color”子菜单的上下文菜单。 子菜单弹出一个颜色列表供选择。 现在,当鼠标光标在特定颜色上时,我希望它更改“所选颜色”的标签。 当鼠标光标离开所选颜色菜单项时,我想标记恢复其原始文本。

以下代码演示了在选择菜单项时更改标签 - 鼠标结束。

    private void Init()
    {
        var mnuContextMenu = new ContextMenu();
        this.ContextMenu = mnuContextMenu;

        var smthingElseMenu = new MenuItem("Do something else");
        var setColorMenu = new MenuItem("Set Color");

        var colorBlue = new MenuItem("Blue");
        var colorRed = new MenuItem("Red");
        var colorGreen = new MenuItem("Green");

        mnuContextMenu.MenuItems.Add(smthingElseMenu);
        mnuContextMenu.MenuItems.Add(setColorMenu);
        setColorMenu.MenuItems.Add(colorBlue);
        setColorMenu.MenuItems.Add(colorRed);
        setColorMenu.MenuItems.Add(colorGreen);

        colorBlue.Select += ColorSelect;
        colorRed.Select += ColorSelect;
        colorGreen.Select += ColorSelect;
    }

    void ColorSelect(object sender, EventArgs e)
    {
        lblSelectedColor.Text = ((MenuItem) sender).Text;
    }

但是当鼠标光标离开菜单项时,我找不到一种方法来恢复标签文本。 任何想法如何为MenuItem实现某种'取消选择'/'MouseLeave'事件?

4 个答案:

答案 0 :(得分:1)

不幸的是,MenuItems没有“取消选择”事件。

我只会抓住您的上下文菜单中的Collapse事件,并在那里重置您的标签。这将带来额外的好处,如果您的用户将鼠标悬停在“红色”选项上,然后将其悬停在上下文菜单中,标签应保持红色,直到上下文菜单关闭。

mnuContextMenu.Collapse += (s, e) => lblSelectedColor.Text = "None";

如果您在鼠标离开上下文菜单时确实需要重置标签,那么您可以捕获围绕ContextMenu的Panel(或其他)的MouseEnter事件。

MyPanel.MouseEnter += (s, e) => lblSelectedColor.Text = "None";

编辑请考虑使用ContextMenuStrip类。 ToolSTripMenuItem类有一个MouseLeave事件。还有一个Checked属性,可能就是你真正想要的。

答案 1 :(得分:1)

你不能只保存旧的MenuItem引用。

private MenuItem _oldMenuItem;

void ColorSelect(object sender, EventArgs e)
    {
        if(_oldMenuItem != null) _oldMenuItem.Text = someText;
        _oldMenuItem = sender as MenuItem;

        lblSelectedColor.Text = ((MenuItem) sender).Text;
    }

答案 2 :(得分:0)

使用MouseEnterMouseLeave事件来处理所有事情。当鼠标指针进入此元素的边界时,首先引发。第二个鼠标指针离开边界 - 此时您将恢复默认标签文本。

编辑就像汉斯在评论中指出的那样使用ContextMenuStrip和ToolStripMenuItems,你就会有这些事件。

答案 3 :(得分:0)

你不能用:

    private void colorBlue_MouseEnter(object sender, EventArgs e)
    {
         // use color blue
    }

    private void colorBlue_MouseLeave(object sender, EventArgs e)
    {
         // use old color
    }