WPF: при нажатии клавиши Alt мое ContextMenu не открывается

В моем приложении WPF, когда ContextMenu открывается, я хочу настроить его пункты меню в зависимости от того, 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 нажимая правой кнопкой мыши на TextFieldпроисходит то же самое - встроенное меню "Вырезать / Копировать / Вставить" мигает, а затем сразу закрывается.

Одно предчувствие, что это как-то связано с Alt активировать строку меню приложения. Но строка меню приложения не применима к моей ситуации, поэтому, если решение связано с этим, оно все равно будет работать для меня.

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;
            }
        }

Почему бы не использовать другой ключ-модификатор??

Это встроенное поведение из 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.

Вы все еще можете использовать клавишу Alt, просто переопределите поведение базового класса:

public class AltProofContextMenu : ContextMenu
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if(!(e.SystemKey == Key.LeftAlt || e.SystemKey == Key.RightAlt))
            base.OnKeyDown(e);
    }
}
Другие вопросы по тегам