0

这是一个老问题,这里已经问过(在 WPF 中创建一个简单的、未修改的键绑定),但答案对我不起作用。我还是有问题。

我将 .net core 3.1 与 WPF 一起使用,我想KeyBinding通过代码将 a 定义为未修改的键。

在 XAML 中

<Window.InputBindings>
   <KeyBinding Command="{Binding MyRoutedCommand}" Key="H" />
</Window.InputBindings>

它就像一个魅力。但是如果我尝试定义KeyBindingin 代码,

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 正在工作并且设置InputBindingby 代码失败?

亲切的问候,克里斯托夫

PS:

根据一些评论,我在构造函数后面的代码中发现了以下代码行。

  InputBindings.Add(new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None));

如果我删除这一行,异常就消失了。所以我认为异常的原因找到了。

解决方案(添加于 2020-08-09):

我在问题中提到的代码是正确的。只有我在文件后面的代码中找到的行是异常的原因。如果您比较您看到的代码行,就会发现使用了两个不同KeyBinding的构造函数。

问题是,无参数KeyBinging()构造函数和KeyBinding(key, modifier)构造函数以不同的方式工作。

带有键和修饰符参数的构造函数将在内部创建一个KeyGesture。如果您尝试使用没有修饰键的“可打印”键,KeyGesture 将引发异常。KeyGesture 甚至不支持 shift 键。所以None + HShift + H无效。

但是在 KeyBinding 类本身中,使用这些组合键是没有问题的。如果您需要将 KeyBinding 定义为“可打印”键,只需使用无参数 KeyBiding 构造函数并手动添加 RoutedCommand 和键,然后再将 KeyBinding 添加到 InputBindings。这显示在上面的代码中。

对于评论,我不得不说“谢谢”。没有帮助,我不会在文件隐藏代码中看到我的错误。

4

1 回答 1

0

NotSupportedException: Die Kombination aus Taste und Modifizierer "None+H" wird für KeyGesture nicht unterstützt。

您的两个解决方案都适用于 .NET Framework 以及 .NET Core 3.1。这个例外显然是关于KeyGesture. KeyGesture在创建键绑定时,您使用如下修饰符实例化 a None,这将抛出NotSupportedException. 删除此行或分配一个修饰符将解决它。

InputBindings.Add(new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None));

作为MSDN 关于和修饰键的参考:KeyGesture

在大多数情况下,KeyGesture必须与一个或多个 ModifierKey 相关联。此规则的例外是功能键和数字键盘键,它们本身可以是有效的 KeyGesture。

于 2020-08-05T11:48:43.790 回答