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