【问题标题】:Create a simple, unmodified key binding in WPF (.net core 3.1 /.net 5)在 WPF (.net core 3.1 /.net 5) 中创建一个简单的、未修改的键绑定
【发布时间】: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 + HShift + H 无效。

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

我必须为 cmets 说“谢谢”。如果没有帮助,我就不会在文件隐藏代码中看到我的错误。

【问题讨论】:

  • 你能发布NotSupported Exception的完整消息吗?
  • 原始异常文本添加到问题
  • 所以当他们在整个窗口的任意位置按 H 时,您希望调用命令吗?在文本框中包含文本?
  • routedcommand 本身是如何设置的?
  • @Andy 正确!但是我们在窗口中没有文本框。只有一个 ViewPort3D 控件。通过按一个键 (H) 我想调用一个命令。

标签: c# wpf .net-core inputbinding


【解决方案1】:

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 和修饰键:

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

【讨论】:

  • 好的,我明白了。但为什么 XAML 代码 '' 工作正常?这不一样吗?
  • @ChristofK。不,您发布的 XAML 代码等同于您问题中的 KeyBinding,但 等同于 new KeyBinding(MyRoutedCommand, Key.H, ModifierKeys.None)
  • 谢谢!那是我缺少的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2020-08-17
  • 2021-05-15
  • 2019-11-23
  • 1970-01-01
  • 2020-07-11
相关资源
最近更新 更多