【发布时间】:2020-08-05 10:19:21
【问题描述】:
这是一个老问题,已在此处提出 (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 的“不支持”异常。
原始例外(德语,Visual Studio 2019):
NotSupportedException: Die Kombination aus Taste und Modifizierer "None+H" wird für KeyGesture nicht unterstützt.
有没有人知道原因,为什么 XAML 工作并且通过代码设置 InputBinding 失败?
亲切的问候, 克里斯托夫
PS:
根据一些 cmets,我在构造函数后面的代码中发现了以下代码行。
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。如上面的代码所示。
我必须为 cmets 说“谢谢”。如果没有帮助,我就不会在文件隐藏代码中看到我的错误。
【问题讨论】:
-
你能发布NotSupported Exception的完整消息吗?
-
原始异常文本添加到问题
-
所以当他们在整个窗口的任意位置按 H 时,您希望调用命令吗?在文本框中包含文本?
-
routedcommand 本身是如何设置的?
-
@Andy 正确!但是我们在窗口中没有文本框。只有一个 ViewPort3D 控件。通过按一个键 (H) 我想调用一个命令。
标签: c# wpf .net-core inputbinding