绑定到KeyBinding手势

时间:2015-06-01 16:08:14

标签: c# wpf

我正在尝试按如下方式设置输入手势:

<Window.InputBindings>
    <KeyBinding Command="{Binding MyCommand}" Gesture="{x:Static local:Resources.MyCommandGesture}" />
</Window.InputBindings>

此处资源是资源.resx文件,MyCommandGesture是在其中定义的字符串。这会产生以下异常:

无法将System.String类型的对象强制转换为System.Windows.Input.InputGesture。

如果我只是用资源文件中的字符串替换绑定(例如Gesture =&#34; F2&#34;),则没有问题。有什么建议吗?

编辑: 我们可以通过执行以下操作来实现代码背后的预期结果:

KeyGestureConverter kgc = new KeyGestureConverter();
KeyGesture keyGestureForMyCommand = (KeyGesture)kgc.ConvertFromString(Resources.MyCommandGesture);
this.InputBindings.Add(new KeyBinding(VM.MyCommand, keyGestureForMyCommand));

我希望找到一个XAML解决方案。

1 个答案:

答案 0 :(得分:1)

这不起作用,因为您希望将System.Windows.Input.Key枚举中的有效值放入KeyBinding的Gesture属性中。

如果你这样做:

Gesture="F2"

...即使感觉就像你要放入一个字符串一样,你实际上是从枚举中输入了一个有效的命名常量,因此它可以工作。

但是,如果你使用它:

Gesture="{x:Static local:Resources.MyCommandGesture}"

它会绕过枚举映射,因为您正在使用x:静态标记扩展并最终说&#34;这是一个字符串&#34;。即使该值等于&#34; Key&#34;中的有效常量名称。恩,它不会工作。

如果您真的不能将密钥名称放在XAML中,我个人不会使用资源文件。相反,我有一个类将它们定义为正确的类型,即KeyGestures:

public class KeyGestures
{
    public static KeyGesture KeyCommandAction1 { get { return new KeyGesture(Key.F1); } }
    public static KeyGesture KeyCommandAction2 { get { return new KeyGesture(Key.F2); } }
}

并相应地使用XAML:

<KeyBinding Command="{Binding MyCommand1}" Gesture="{x:Static local:KeyGestures.KeyCommandAction1}" />
<KeyBinding Command="{Binding MyCommand2}" Gesture="{x:Static local:KeyGestures.KeyCommandAction2}" />