这是一个老问题,这里已经问过(在 WPF 中创建一个简单的、未修改的键绑定),但答案对我不起作用。我还是有问题。
我将 .net core 3.1 与 WPF 一起使用,我想KeyBinding
通过代码将 a 定义为未修改的键。
在 XAML 中
<Window.InputBindings>
<KeyBinding Command="{Binding MyRoutedCommand}" Key="H" />
</Window.InputBindings>
它就像一个魅力。但是如果我尝试定义KeyBinding
in 代码,
KeyBinding b = new KeyBinding()
{
Command = MyRoutedCommand,
Key = Key.H
};
InputBindings.Add(b);
None+H
我在启动应用程序时直接收到手势的“NotSupported”异常。
原始异常(德语,Visual Studio 2019):
NotSupportedException: Die Kombination aus Taste und Modifizierer "None+H" wird für KeyGesture nicht unterstützt.
有谁知道原因,为什么 XAML 正在工作并且设置InputBinding
by 代码失败?
亲切的问候,克里斯托夫
PS:
根据一些评论,我在构造函数后面的代码中发现了以下代码行。
InputBindings.Add(new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None));
如果我删除这一行,异常就消失了。所以我认为异常的原因找到了。
解决方案(添加于 2020-08-09):
我在问题中提到的代码是正确的。只有我在文件后面的代码中找到的行是异常的原因。如果您比较您看到的代码行,就会发现使用了两个不同KeyBinding
的构造函数。
问题是,无参数KeyBinging()
构造函数和KeyBinding(key, modifier)
构造函数以不同的方式工作。
带有键和修饰符参数的构造函数将在内部创建一个KeyGesture
。如果您尝试使用没有修饰键的“可打印”键,KeyGesture 将引发异常。KeyGesture 甚至不支持 shift 键。所以None + H
和Shift + H
无效。
但是在 KeyBinding 类本身中,使用这些组合键是没有问题的。如果您需要将 KeyBinding 定义为“可打印”键,只需使用无参数 KeyBiding 构造函数并手动添加 RoutedCommand 和键,然后再将 KeyBinding 添加到 InputBindings。这显示在上面的代码中。
对于评论,我不得不说“谢谢”。没有帮助,我不会在文件隐藏代码中看到我的错误。