8

我正在尝试根据 Silverlight 中的击键来触发命令。据我了解,您不能在 Silverlight 中使用 AccessKey 或 AcceleratorKey。此外,看起来可能有用的附加属性 InputBindings 也不起作用。

我开始在其他地方寻找。看起来 Prism 是让命令在 Silverlight 中工作的方法,所以我检查了一下。但是,它们只有一个 Click 处理程序,这甚至不是设置关键命令的有用起点。

我只是错过了棱镜的某些部分吗?或者是否有一种使用 MVVM Silverlight 处理热键的良好标准方法?

4

3 回答 3

9

听起来您正在寻找一种处理 KeyUp/KeyPress/KeyDown 事件的“无代码”MVVMish 方式。

选项#1:棱镜。
您已经提到它仅Click 命令一起提供。但是,您可以添加自己附加的 DP 以启用您想要的任何事件的命令(如 KeyUp/KeyDown/KeyPress)。

如果您正在寻找有关 Corey 的示例,则该示例适用于 ToggleButton.Checked/Unchecked 事件。
http://www.85turns.com/2009/06/24/togglebutton-command-for-prism/

<ToggleButton x:Name="ToggleButton1" 
            customCommands:Checked.Command="{Binding CheckedCommand}"
            customCommands:UnChecked.Command="{Binding UnCheckedCommand}"
        Margin="8,8,0,8" Content="Check me"
        />

此外,Erik Mork 有一个出色的视频,可以很好地概述命令以及如何创建自定义命令附加 DP。 http://development-guides.silverbaylabs.org/Video/Prism-Commands

选项#2:混合触发器
Expression Blend SDK 附带了触发器和行为,这些触发器和行为可以针对您尝试执行的操作。
Blend 示例codeplex 项目附带一个您可以使用的 EventTrigger:

<i:EventTrigger EventName="Click">
      <si:InvokeDataCommand Command="{Binding ShoppingCart.CheckOutCommand}"/>
</i:EventTrigger>

或者,您可以为击键事件创建自己的自定义触发器,并在那里做任何您想做的事情。这是一个示例:
http ://azurecoding.net/blogs/brownie/archive/2009/04/06/blend-behaviors-ftw.aspx

于 2009-09-29T00:41:27.200 回答
0

你的意思是像 Ctrl+v 之类的吗?我在MSDN 网站上看到了以下示例。

void Canvas_KeyUp(object sender, KeyEventArgs e)
{
    //check for the specific 'v' key, then check modifiers
    if (e.Key==Key.V) { 
        if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) {
        //specific Ctrl+V action here
        }
    } // else ignore the keystroke
}
于 2009-09-28T16:31:23.190 回答
0

MVVM 工具包包含一个有趣的类CommandReference,它允许您将 InputBindings 绑定到 ViewModel 命令。我不确定它是否适用于 Silverlight,但您可以尝试一下...

好的,正如 RandomEngy 指出的那样,Silverlight 中没有 InputBindings ......

但是,我认为您可以使用附加行为。这是一种将事件“绑定”到 ViewModel 的命令的方法。Marlon Grech在这里有一个很好的实现

于 2009-09-28T16:35:02.360 回答