【问题标题】:Hotkey commands for Silverlight in MVVM?MVVM 中 Silverlight 的热键命令?
【发布时间】:2010-12-01 11:24:47
【问题描述】:

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

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

我只是缺少 Prism 的某些部分吗?或者有没有很好的标准方法来处理 MVVM Silverlight 的热键?

【问题讨论】:

  • 我很好奇这个问题是否有答案。

标签: c# silverlight mvvm prism hotkeys


【解决方案1】:

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

选项 #1:棱镜。
您已经提到它仅通过 Click 命令ships。但是,您可以添加自己附加的 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 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

【讨论】:

  • 我赞同贾斯汀的回应。我使用选项 #2 创建了 KeyDown/KeyUp 命令附件,并在我的 SL 应用程序中处理 PageUp/PageDown 和其他热键。它真的很好用。我通过命令参数传递密钥代码,因此我的命令可以正确处理密钥代码。创建大量这些附加命令是一个好主意。它们易于编写,并且可以在任何需要它们的地方轻松使用。
  • 至于选项 #1:Prism 模型适用于不需要额外信息的事件,但如果您想拥有同一事件的变体,例如 KeyDown 上的不同键,则该模型会失效。它的实现仅依赖于每个元素的一个附加属性,但要处理热键,您将需要同一元素上的多个附加属性。附加的属性行为实现不允许这样做。选项 #2/Brian:理想情况下,您不希望在视图中而不是在命令实现中指定热键吗?
  • 我真的很喜欢那个混合行为示例。那是一个聪明的人;)
【解决方案2】:

你的意思是像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
}

【讨论】:

  • 我正在寻找一种 MVVM 命令模式。我已经知道如何将它连接到代码隐藏中。
【解决方案3】:

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

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

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

【讨论】:

  • 我不相信 Silverlight 有 InputBindings。
  • 你说得对,我忘记了这个细节......当我看到 Silverlight 与 WPF 相比的局限性时,我总是感到震惊
猜你喜欢
  • 2011-07-22
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多