2

在我的 WPF 应用程序中,当 aContextMenu打开时,我想根据是否Alt按下键来调整其菜单项。

我有逻辑工作。XAML:

<my:Control ContextMenuOpening="MyContextMenu_Opening" />

代码:

private void MyContextMenu_Opening(object sender, RoutedEventArgs args) {
  bool isAltDown = Keyboard.IsKeyDown(Key.LeftAlt);
  /* tweak menu items here */
}

我的问题是当Alt按键被按下时,上下文菜单打开然后立即关闭(我可以在它打开的瞬间看到我的逻辑至少在工作)。

我想知道这是否是 WPF 的“功能”,因为如果我Alt在右键单击 aTextField的同时按住,也会发生同样的事情 - 内置的剪切/复制/粘贴菜单闪烁打开然后立即关闭。

一种预感是它与Alt激活应用程序菜单栏有关。但是应用程序菜单栏不适用于我的情况,所以如果解决方案涉及到弄乱它,它仍然对我有用。

4

3 回答 3

3

这是 MenuBase 类中的内置行为:

        protected override void OnKeyDown(KeyEventArgs e)
        {
            .....
            if (((e.SystemKey == Key.LeftAlt) || (e.SystemKey == Key.RightAlt)) || (e.SystemKey == Key.F10))
            {
                this.KeyboardLeaveMenuMode();
                e.Handled = true;
            }
        }

为什么不使用另一个修饰键?

于 2013-03-06T13:10:01.650 回答
1

这是MSDN MenuBase.OnKeyDown的内置行为

    If the user presses ESC, ALT+ALT, or ALT+F10, 
    this implementation marks the KeyDown event as handled 
    by setting the Handled property of the event data to true.
于 2013-03-06T13:25:08.447 回答
0

您仍然可以使用 Alt 键,只需覆盖基类行为:

public class AltProofContextMenu : ContextMenu
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if(!(e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt))
            base.OnKeyDown(e);
    }
}
于 2018-11-29T16:55:38.203 回答