当用户将鼠标悬停在菜单项上时,我正在尝试实施“预览”方案。
例如,假设一个程序有一个带有“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'事件?
答案 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)
使用MouseEnter
和MouseLeave
事件来处理所有事情。当鼠标指针进入此元素的边界时,首先引发。第二个鼠标指针离开边界 - 此时您将恢复默认标签文本。
编辑就像汉斯在评论中指出的那样使用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
}