如何确定 MVVM 应用程序中的不活动状态?
我有一个 MVVM kiosk 应用程序,当它处于非活动状态一段时间后,我需要重新启动它。我使用 Prism 和 Unity 来促进 MVVM 模式。我已经重新启动了,我什至知道如何处理计时器。我想知道的是如何知道活动(即任何鼠标事件)何时发生。我知道如何做到这一点的唯一方法是订阅主窗口的预览鼠标事件。这打破了 MVVM 的想法,不是吗?
我考虑过将我的窗口公开为一个接口,将这些事件公开给我的应用程序,但这需要窗口实现该接口,这似乎也会破坏 MVVM。
I have an MVVM kiosk application that I need to restart when it has been inactive for a set amount of time. I'm using Prism and Unity to facilitate the MVVM pattern. I've got the restarting down and I even know how to handle the timer. What I want to know is how to know when activity, that is any mouse event, has taken occurred. The only way I know how to do that is by subscribing to the preview mouse events of the main window. That breaks MVVM thought, doesn't it?
I've thought about exposing my window as an interface that exposes those events to my application, but that would require that the window implement that interface which also seems to break MVVM.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
另一种选择是使用 Windows API 方法 GetLastInputInfo。
一些警告
使用方法很简单。调用 UserIdleMonitor.RegisterForNotification。您传入通知方法和 TimeSpan。如果用户活动发生,然后在指定的时间内停止,则调用通知方法。您必须重新注册才能收到另一条通知,并且可以随时取消注册。如果 49.7 天(加上idlePeriod)没有任何活动,则会调用通知方法。
已更新
修复了如果您尝试通过通知方法重新注册可能会死锁的问题。
修复了未签名的数学并未经检查地添加了。
对计时器处理程序进行轻微优化,仅根据需要分配通知。
注释掉调试输出。
更改为使用 DispatchTimer。
添加了取消注册的功能。
在公共方法中添加了线程检查,因为这不再是线程安全的。
Another option is to use the Windows API method GetLastInputInfo.
Some cavets
Usage is simple. Call UserIdleMonitor.RegisterForNotification. You pass in a notification method and a TimeSpan. If user activity occurs and then ceases for the period specified, the notification method is called. You must re-register to get another notification, and can Unregister at any time. If there is no activity for 49.7 days (plus the idlePeriod), the notification method will be called.
Updated
Fixed issue where if you tried to re-register from the notification method you could deadlock.
Fixed unsigned math and added unchecked.
Slight optimization in timer handler to allocate notifications only as needed.
Commented out the debugging output.
Altered to use DispatchTimer.
Added ability to Unregister.
Added thread checks in public methods as this is no longer thread-safe.
您可以使用 MVVM Light EventToCommand 行为将 MouseMove/MouseLeftButtonDown 事件链接到命令。这通常是混合完成的,因为它非常简单。
如果您没有 Blend,这里有一些示例 xaml:
其中 i: 是 Blend.Interactivity 的 xml 命名空间。
You could maybe use MVVM Light's EventToCommand behaviour to link the MouseMove/MouseLeftButtonDown event to a command. This is normally done in blend because it's really easy.
Here's some example xaml if you don't have blend:
Where i: is a xml namespace for Blend.Interactivity.
这不是官方答案,但这是我的 UserIdleMonitor 版本,供感兴趣的人使用:
This is not an official answer, but here is my version of
UserIdleMonitor
for anyone who is interested:这实际上取决于你如何做。
您可以很容易地编写一个行为或附加属性,将其挂钩到此事件中,并使用它来触发 ViewModel 中的 ICommand。这样,您基本上将“发生了一些事情”事件推送到虚拟机,在那里您可以在业务逻辑中完全处理该事件。
That really depends on how you do it.
You could pretty easily write a Behavior or an Attached Property that you hook into this event and use it to trigger an ICommand in your ViewModel. This way, you're basically pushing a "Something happened" event down to the VM, where you can handle this completely in your business logic.