在我的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
激活应用程序菜单栏有关。但是一个应用程序菜单栏并不适用于我的情况,所以如果解决方案涉及到搞乱它,它仍然适用于我。
这是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菜单库。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);
}
}