有谁知道每当突出显示菜单项时就会触发一个事件?
我想在状态栏中显示每个菜单命令突出显示的描述。无论是使用鼠标还是键盘突出显示它们,我都希望发生这种情况。
但经过相当多的努力,我没有看到任何类似的事件。我什至尝试覆盖WndProc
检测原始菜单消息但发现没有发送。显然,WinForms 不使用标准的 Windows 菜单。
似乎知道菜单项何时被点击以及何时被选择(突出显示而不被点击)应该是两个最重要的菜单事件。我不知道为什么后者不被支持。
有人能弄清楚这一点吗?
UPDATE
在此处给出的答案的帮助下,我能够想出一个完整的解决方案。我已经将该解决方案作为开源发布在NuGet https://www.nuget.org/packages/SoftCircuits.MenuStatus and GitHub https://github.com/SoftCircuits/SoftCircuits.MenuStatus.
除了鼠标事件之外,您还可以通过处理来添加键盘按键部分KeyUp
所有者菜单的事件以获取所选项目并在状态栏标签中显示说明。
public YourForm()
{
InitializeComponent();
menuStrip1.ShowItemToolTips = false;
menuStrip1.KeyUp += OnToolStripKeyUp;
foreach (var item in GetAllToolStripItems(menuStrip1.Items))
{
item.AutoToolTip = false;
item.MouseEnter += OnToolStripItemMouseEnter;
item.MouseLeave += OnToolStripItemMouseLeave;
if (item.GetCurrentParent() is ToolStrip dm)
{
dm.ShowItemToolTips = false;
dm.KeyUp -= OnToolStripKeyUp;
dm.KeyUp += OnToolStripKeyUp;
}
}
}
private void OnToolStripItemMouseEnter(object sender, EventArgs e)
{
sbrLabel.Text = (sender as ToolStripItem).ToolTipText;
}
private void OnToolStripItemMouseLeave(object sender, EventArgs e)
{
sbrLabel.Text = "Ready";
}
private void OnToolStripKeyUp(object sender, KeyEventArgs e)
{
var s = sender as ToolStrip;
var selItem = s.Items.OfType<ToolStripMenuItem>().FirstOrDefault(x => x.Selected);
sbrLabel.Text = selItem?.ToolTipText;
}
private IEnumerable<ToolStripItem> GetAllToolStripItems(ToolStripItemCollection tsic)
{
foreach (var tsi in tsic.Cast<ToolStripItem>())
{
yield return tsi;
if (tsi is ToolStripDropDownItem tsddi && tsddi.HasDropDown)
foreach (var ddi in GetAllToolStripItems(tsddi.DropDownItems))
yield return ddi;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)