2013-03-06 2 views
2

В моем приложении WPF, когда открывается ContextMenu, я хочу настроить его пункты меню в зависимости от того, нажата ли клавиша Alt.WPF: Когда нажата клавиша Alt, мой ContextMenu не откроется

У меня есть логика работы. 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 происходит то же самое - встроенное меню Cut/Copy/Paste начинает мигать, а затем немедленно закрывается.

Одна догадка заключается в том, что она имеет какое-то отношение к 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; 
      } 
     } 

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

+0

Да, я думаю, мне придется использовать другой модификатор ключа, как вы предлагаете. С тех пор я заметил, что такое поведение происходит прямо в Windows (например, в текстовом поле диалогового окна «Пуск»> «Запуск»), поэтому я полагаю, что WPF, по крайней мере, согласуется с тем, как остальные ОС Windows работают для работы ... – Ross

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. 
Смежные вопросы