我正在尝试在InputGesture
上设置RoutedUICommand
,并在用户按下Ctrl + =
时将其挂起。我正在使用KeyGesture
对象,但我无法在System.Windows.Input.Key
枚举中看到等于('=')键的条目。
我期待的是能够做到以下几点:
ZoomIn = new RoutedUICommand("Zoom In", "ZoomIn", typeof(Window),
new InputGestureCollection {
new KeyGesture(Key.Equals, ModifierKeys.Control)
});
有人能指出我正确的方向吗?
答案 0 :(得分:2)
正如克里斯夫所指出的,我需要让我的大脑稍微活动一下。对于它的价值,处理KeyDown
事件时生成的值为Key.OemPlus
。
<强>更新强>
这样做的一个结果是,如果你和我做同样的事情并且你将在菜单中使用该命令,你可能想要使用重载的KeyGesture
构造函数来获取第3个参数displayString
。例如:
new KeyGesture(Key.Equals, ModifierKeys.Control, "Ctrl+=")
否则,您会看到键盘快捷键显示为(在我的情况下)“Ctrl + OemPlus”,这不是完全合乎需要的。不可否认,上述情况仍然不是很好,但它比“OemPlus”更好。
答案 1 :(得分:2)
一个hack是捕获shift keydown,如果OemPlus keydown在shift键之前,你有一个“OemEqual”。 代码可能如下所示:
private bool shift = false;
private void Window_KeyDown(object sender, KeyEventArgs e)
{
Key key = e.Key;
switch (key) {
case Key.LeftShift: this.shift = true; break;
case Key.RightShift: this.shift = true; break;
case Key.C: this.helper.Command(CMD.CLEAR); break;
case Key.Enter: this.helper.Command(CMD.EVAL); break;
case Key.OemMinus: this.helper.Operator(OP.SUB); break;
case Key.OemPlus:
if (this.shift) {
this.helper.Operator(OP.ADD);
} else {
this.helper.Command(CMD.EVAL);
} break;
case Key.OemPeriod: this.helper.Number(NumberPad.DECIMAL); break;
case Key.D0: this.helper.Number(NumberPad.ZERO); break;
case Key.D1: this.helper.Number(NumberPad.ONE); break;
case Key.D2: this.helper.Number(NumberPad.TWO); break;
:
}
}
private void Window_KeyUp(object sender, KeyEventArgs e)
{
Key key = e.Key;
switch (key) {
case Key.LeftShift: this.shift = false; break;
case Key.RightShift: this.shift = false; break;
}
}
答案 2 :(得分:0)
如果我测试一下,我会将Key.Unknown
作为关键代码,PlatformKeyCode=
= 0x000000bb
(187)