在 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 + H
和 Shift + 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.
这是一个老问题,已经在这里问过 (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 + H
和 Shift + 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.