如何在视图内拦截RoutedCommand的执行?

7
在一个WPF / MVVM应用程序中,我正在尝试找到一种代码有效的方法,在任何耗时操作之前将主视图光标设置为Cursors.Wait,并在完成后将其恢复为默认光标。
由于所有操作都是使用路由命令调用的,我想找到一种拦截命令执行的方法,理想情况下是通过创建一个通用命令类来包装内置路由命令的实例,但我无法想象如何做到这一点。
具体而言,RoutedCommand.Execute方法不是虚方法,因此我需要另一种机制来拦截其调用。此外,我不确定通用命令类的实例将如何引用它必须设置光标的视图。
请给予任何建议?

可能你有某种原因想要这样做,听起来有些复杂,但是你不能在ViewModel中创建一个CurrentCursor属性,然后将View中的光标绑定到该属性吗? - Wonko the Sane
1
@Wonko。谢谢 - 这是一个好问题,我同意这似乎是最符合MVVM的方法。然而,这意味着我将不得不对许多ViewModel方法应用相同的2行代码更改,而我希望集中光标管理代码。第二个复杂性是我的View包含一些接受路由命令的控件。由于它们不是ViewModel的一部分,我如何将相同的逻辑应用于它们的操作? - Tim Coulter
1个回答

3
你可以静态地设置光标。这样做的效果是,当应用程序拥有焦点时,光标将处于“等待”状态,而不是在特定控件上时才如此。
以下是在长时间操作开始时作为ViewModel的一部分的代码:
Mouse.OverrideCursor = Cursors.Wait;

操作完成后,您需要像这样清除覆盖:

Move.OverrideCursor = null;

感谢您的想法并+1教给我新的有用知识,但它仍然没有真正解决我在评论@Wonko中提出的问题。 - Tim Coulter
另一种选择是创建自己的ICommand实现。其中一个流行的实现称为RelayCommand,我相信你可以在网上找到它的实现。如果您将其用于命令,则可以在基类型的“执行”处理中抽象出此光标处理。据我所知,没有办法全局拦截所有路由命令。唯一的缺点是您的命令不再是“路由”的。而是推送到ViewModel中。希望这有所帮助。 - Steven
再次感谢Steven。这正是我想要实现的东西,尽管我认为我需要考虑一下是否可以在没有命令路由的情况下生存。我很难想象在针对控件的内置命令(例如针对RichTextBox的ToggleBold命令)的情况下,这将如何工作。有没有办法使用RelayCommand使此场景起作用? - Tim Coulter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接