有沒有人想出一個在突出顯示選單項時觸發的事件?
我想在狀態欄中顯示每個選單命令的描述,因為它們被突出顯示。無論使用滑鼠還是鍵盤突出顯示它們,我都希望發生這種情況。
但經過相當大的努力,我沒有看到任何這樣的事件。我什至嘗試覆寫WndProc以檢測原始選單訊息,但沒有發送任何訊息。顯然,WinForms 不使用標準的 Windows 選單。
似乎知道何時單擊選單項以及何時選擇選單項(突出顯示而不被單擊)應該是兩個最重要的選單事件。我不知道為什么不支持后者。
任何人都能夠解決這個問題?
uj5u.com熱心網友回復:
除了滑鼠事件之外,您還可以通過處理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;
}
}

uj5u.com熱心網友回復:
在@dr.null 的幫助下,我完成了這項作業。這是我的代碼版本。
private void InitializeMenuStatus(ToolStrip toolStrip)
{
toolStrip.ShowItemToolTips = false;
toolStrip.KeyUp = ToolStrip_KeyUp;
foreach (ToolStripItem toolStripItem in toolStrip.Items)
{
toolStripItem.AutoToolTip = false;
toolStripItem.MouseEnter = ToolStripItem_MouseEnter;
toolStripItem.MouseLeave = ToolStripItem_MouseLeave;
if (toolStripItem is ToolStripDropDownItem dropDownItem)
InitializeMenuStatus(dropDownItem.DropDown);
}
}
private ToolStripItem? SelectedMenuItem = null;
private void SetSelectedMenuItem(ToolStripItem? item)
{
if (!ReferenceEquals(item, SelectedMenuItem))
{
SelectedMenuItem = item;
lblStatus.Text = item?.ToolTipText ?? string.Empty;
}
}
private void ToolStripItem_MouseEnter(object? sender, EventArgs e)
{
if (sender is ToolStripMenuItem menuItem && menuItem.Selected)
SetSelectedMenuItem(menuItem);
}
private void ToolStripItem_MouseLeave(object? sender, EventArgs e)
{
SetSelectedMenuItem(null);
}
private void ToolStrip_KeyUp(object? sender, KeyEventArgs e)
{
if (sender is ToolStripDropDownMenu dropDownMenu)
{
ToolStripMenuItem? menuItem = dropDownMenu.Items.OfType<ToolStripMenuItem>()
.Where(m => m.Selected)
.FirstOrDefault();
SetSelectedMenuItem(menuItem);
}
}
為什么Selected從未將事件添加到選單項中讓我感到困惑。我建議添加它。如果您同意,請去表示您對該請求的支持。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/412291.html
標籤:
下一篇:nodejs中的Spring物體
