【问题标题】:How to intercept execution of a RoutedCommand within the view?如何在视图中拦截 RoutedCommand 的执行?
【发布时间】:2011-03-12 18:08:54
【问题描述】:

在 WPF / MVVM 应用程序中,我试图找到一种代码高效的方法,在任何冗长操作之前将主视图光标设置为 Cursors.Wait,并在完成后将其恢复为默认光标。

由于所有操作都是使用路由命令调用的,所以我想找到一种拦截命令执行的方法,理想情况下是通过创建一个包含内置路由命令实例的通用命令类,但我无法可视化如何做到这一点。

具体来说,RoutedCommand.Execute 方法不是虚拟的,所以我需要另一种机制来拦截它的调用。另外,我不确定通用命令类的实例如何引用它必须为其设置光标的视图。

有什么建议吗?

【问题讨论】:

  • 这很可能是您想要这样做的原因,这听起来有些复杂,但是您是否有理由不能简单地在 ViewModel 中创建 CurrentCursor 属性,并将光标绑定到您对该物业的看法?
  • @Wonko。谢谢 - 这是一个很好的问题,我同意这似乎是最符合 MVVM 的方法。但是,这意味着我将不得不对许多 ViewModel 方法应用相同的 2 行代码更改,而我希望集中光标管理代码。第二个复杂因素是我的视图包含一些接受路由命令的控件。我如何将相同的逻辑应用于它们的操作,因为它们不是 ViewModel 的一部分?

标签: wpf mvvm mouse-cursor routed-commands


【解决方案1】:

您可以以静态方式设置光标。效果是当应用程序有焦点而不是在某个控件上时,光标将是“等待”。

代码,在冗长操作开始时将成为 ViewModel 的一部分:

Mouse.OverrideCursor = Cursors.Wait;

操作完成后,您必须像这样清除覆盖:

Move.OverrideCursor = null;

【讨论】:

  • 感谢您的想法和 +1 教我一些新的和有用的东西,但它仍然不能真正解决我在对 @Wonko 的评论中提出的问题。
  • 这里的替代方法是创建您自己的 ICommand 实现。一个流行的称为 RelayCommand,我相信您可以在网上的某个地方找到它的实现。如果您将它用于您的命令,那么您可以在基本类型的“执行”处理中抽象出这个游标处理。据我所知,没有办法全局拦截所有路由命令。唯一的缺点是您的命令不再“路由”。相反,它们被推送到 ViewModel。希望对您有所帮助。
  • 再次感谢史蒂文。这正是我想要实现的目标,尽管我想我需要考虑是否可以在没有路由命令的情况下生存。我正在努力想象在以控件为目标的内置命令(例如,以 RichTextBox 为目标的 ToggleBold 命令)的情况下这将如何工作。有没有办法让这个场景与 RelayCommand 一起工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多