在 WPF (.net core 3.1 /.net 5) 中创建一个简单的、未修改的键绑定

Create a simple, unmodified key binding in WPF (.net core 3.1 /.net 5)

这是一个老问题,已经在这里问过 (Create a simple, unmodified key binding in WPF),但答案对我不起作用。我还有问题。

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

在XAML

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

它就像一个魅力。但是如果我尝试在代码中定义 KeyBinding

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 失败?

亲切的问候, 克里斯托夫

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 无效。

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

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

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

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

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

来自 MSDN 的 reference 关于 KeyGesture 和修改键:

In most cases, a KeyGesture must be associated with one or more ModifierKeys. The exceptions to this rule are the function keys and the numeric keypad keys, which can be a valid KeyGesture by themselves.