WPF - 如何让动态添加的菜单项助记符起作用

WPF - How to get dynamically added Menu Item Mnemonics to work

我正在动态创建子菜单,但我发现 _ 菜单项助记符无法触发菜单命令。使用 alt 菜单导航(即在我的 Window 菜单下)打开菜单时,项目显示下划线:

var mi = Model.Window.MainMenuWindow;               
mi.Items.Clear();

mi.Items.Add(new MenuItem { Header = "_Close Document", Command=Model.Commands.CloseActiveDocumentCommand   });
mi.Items.Add(new MenuItem { Header = "C_lose All Documents", Command=Model.Commands.CloseAllDocumentsCommand, CommandParameter = "All" });
mi.Items.Add(new MenuItem { Header = "Close All _But This Document", Command = Model.Commands.CloseAllDocumentsCommand, CommandParameter="AllBut" });

var menuItems = Model.Window.GenerateContextMenuItemsFromOpenTabs();
if (menuItems.Count < 1)
    return;

mi.Items.Add(new Separator());
foreach (var menu in menuItems)
{

    mi.Items.Add(menu);
}

mi.IsSubmenuOpen = true;

这是它的样子:

助记符 属性 显示快捷方式,但热键无法触发相关命令。

当动态添加项目以使快捷方式链接起作用时,菜单是否需要做一些特殊的事情?

FWIW,我正在使用 MahApps.Metro,但我怀疑这并不是真正相关的。

将焦点设置在菜单上将解决此问题。

void ShowActiveTabsList()
{
    WindowMenuCommand = new CommandBase((parameter, command) =>
    {
        var mi = Model.Window.MainMenuWindow;
        mi.Items.Clear();

        mi.Items.Add(new MenuItem { Header = "_Close Document", Command= Model.Commands.CloseActiveDocumentCommand  });
        mi.Items.Add(new MenuItem { Header = "Close _All Documents", Command = Model.Commands.CloseAllDocumentsCommand });
        mi.Items.Add(new MenuItem { Header = "Close All _But This Document", Command = Model.Commands.CloseAllDocumentsCommand, CommandParameter="AllBut" });

        var menuItems = Model.Window.GenerateContextMenuItemsFromOpenTabs();
        if (menuItems.Count < 1)
            return;

        mi.Items.Add(new Separator());
        foreach (var menu in menuItems)
        {

            mi.Items.Add(menu);
        }

        mi.IsSubmenuOpen = true;
        // focus the menu to enable the mnemonics for the dynamically created submenus
        mi.Focus();

        mi.SubmenuClosed += (s,e) => ((MenuItem)s).Items.Clear();
    }, (p, c) => true);
}