【问题标题】:"Unselect" event for MenuItemMenuItem 的“取消选择”事件
【发布时间】:2012-11-19 14:52:39
【问题描述】:

我正在尝试在用户悬停菜单项时实现“预览”场景。

例如,假设一个程序有一个带有“设置颜色”子菜单的上下文菜单。 子菜单弹出一个可供选择的颜色列表。 现在,当鼠标光标位于特定颜色上时,我希望它更改“选定颜色”的标签。 并且当鼠标光标离开选中的颜色菜单项时,我想给标签恢复原来的文字。

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

    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”事件?

【问题讨论】:

  • 很难想象这会有什么用,当上下文菜单关闭时,您将永远无法选择颜色。请考虑改用 ContextMenuStrip 类。 ToolSTripMenuItem 类有一个 MouseLeave 事件。还有一个 Checked 属性,可能是您真正想要的。
  • 如果我只想在鼠标“悬停”上预览,这很有用。当用户在该菜单项上实际单击 时,我将设置选定的颜色。 ContextMenuStrip 和 ToolSTripMenuItem 是我正在寻找的答案。谢谢!
  • 好的,有道理。在这种情况下,ContextMenu.Closed 事件足以恢复之前的选择。

标签: c# winforms


【解决方案1】:

很遗憾,MenuItems 没有“取消选择”事件。

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

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

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

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

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

【讨论】:

  • 我需要在光标在菜单项上时更改标签,并在光标离开菜单项时恢复其原始状态。
  • @avir - 你为什么这么说?这是一个您可以订阅的公共活动。
  • 在这种情况下,折叠事件无济于事,因为即使菜单仍然可见并且光标不在菜单项上,我也需要恢复标签。
【解决方案2】:

你不能只保存旧的 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;
    }

【讨论】:

    【解决方案3】:

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

    EDIT 像 Hans 在评论中指出的那样使用 ContextMenuStrip 和 ToolStripMenuItems,您将拥有这些事件。

    【讨论】:

    • 如何将它用于 MenuItem 类?这些事件似乎不存在。
    • MenuItem 类中确实存在这两种方法
    【解决方案4】:

    你不能用吗:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2015-11-27
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      相关资源
      最近更新 更多