MVVM中的Silverlight热键命令?

时间:2009-09-25 15:46:45

标签: c# silverlight mvvm prism hotkeys

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

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

我是否只是错过了Prism的某些部分?或者有一个很好的标准方法来处理MVVM Silverlight的热键吗?

3 个答案:

答案 0 :(得分:9)

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

选项#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有一个出色的视频,可以让您对命令以及如何创建自定义命令Attached DP有一个很好的概述。 http://development-guides.silverbaylabs.org/Video/Prism-Commands

选项#2:混合触发器
Expression Blend SDK附带了触发器和行为,这些触发器和行为是您尝试做的事情 Blend Examples 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

答案 1 :(得分:0)

你的意思是Ctrl + v等 我在MSDN site看到了以下示例。

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
}

答案 2 :(得分:0)

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

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

但是,我认为你可以使用附加行为。这是一种将事件“绑定”到ViewModel命令的方法。 Marlon Grech有a good implementation here