“Unselect"事件用于MenuItem
本文关键字:事件 用于 MenuItem quot Unselect | 更新日期: 2023-09-27 18:16:19
我正在尝试实现当用户悬停菜单项时的'预览'场景。
例如,假设一个程序有一个带有"设置颜色"子菜单的上下文菜单。子菜单弹出一个可供选择的颜色列表。现在,当鼠标光标在特定颜色上时,我希望它改变一个标签"Selected 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;
}
但是当鼠标离开菜单项时,我找不到使标签文本恢复的方法。任何想法我怎么能实现某种'Unselect'/'MouseLeave'事件的菜单项?
遗憾的是,菜单项没有"取消选择"事件。
我会抓住你的上下文菜单的崩溃事件,并重置你的标签在那里。这还有一个额外的好处,如果你的用户将鼠标悬停在"红色"选项上,然后将鼠标悬停在上下文菜单上,那么标签应该保持红色,直到上下文菜单关闭。
mnuContextMenu.Collapse += (s, e) => lblSelectedColor.Text = "None";
如果你真的需要它重置标签当你的鼠标离开上下文菜单,那么你可以捕捉面板的MouseEnter
事件(或任何)你有围绕上下文菜单。
MyPanel.MouseEnter += (s, e) => lblSelectedColor.Text = "None";
EDIT请考虑使用ContextMenuStrip类。ToolSTripMenuItem类有一个MouseLeave事件。还有一个Checked属性,可能是你真正想要的
你就不能保存旧的MenuItem ref.
private MenuItem _oldMenuItem;
void ColorSelect(object sender, EventArgs e)
{
if(_oldMenuItem != null) _oldMenuItem.Text = someText;
_oldMenuItem = sender as MenuItem;
lblSelectedColor.Text = ((MenuItem) sender).Text;
}
使用MouseEnter
和MouseLeave
事件来处理一切。当鼠标指针进入该元素的边界时引发第一个。第二个鼠标指针离开边界-此时您将恢复默认标签文本。
EDIT就像Hans在评论中指出的那样,使用ContextMenuStrip和ToolStripMenuItems,你就会有这些事件了
你不能用:
private void colorBlue_MouseEnter(object sender, EventArgs e)
{
// use color blue
}
private void colorBlue_MouseLeave(object sender, EventArgs e)
{
// use old color
}