Win32 events + WPF + MVVM

本文关键字:MVVM WPF Win32 events | 更新日期: 2023-09-27 17:57:12

SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

我正在构建一个 wpf 应用程序,它乘以工作站锁定和解锁之间的时间但是我很难在不放入主窗口代码的情况下实现它

IM 用于启动和停止计时器的代码

SystemEvents.SessionSwitch +=
                new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
        {
            if (e.Reason == SessionSwitchReason.SessionLock)
            {
                //Start Timer
            }
            else if (e.Reason == SessionSwitchReason.SessionUnlock)
            {
                //Stop Timer -> show window
            }
        }

问题是,此事件驻留在 Microsoft.Win32 中 - 我似乎无法在 XAML 中引用它(如果可以的话,我会将其连接到 ICommand 代替)

所以你们所有的 MVVM 专家,我该怎么办?我是否将其保存在主窗口代码隐藏中?或者我实际上可以在 XAML 中引用 Win32

还有一个附带的问题...计时器逻辑 - 我是否将其保存在单独的类中并将值存储在模型中?不用说 - 我对 MVVM 相当陌生

Win32 events + WPF + MVVM

MVVM 背后的核心原则是单元可测试性和责任分离。 这通常是通过确保 ViewModel 不了解其上方的层(即"视图")来强制执行的,也不应直接与任何特定于平台的类(即 Microsoft.Win32.SystemEvents )。

我可能建议的一种方法是创建您自己的ISystemEvents界面,该界面仅公开您希望 ViewModel 处理的事件。 此接口的实现可以被视为"模型"层的一部分,并且基本上包装了来自Microsoft.Win32.SystemEvents的所需事件。 您的应用程序将"注入"接口作为 ViewModel 初始化的一部分。

public interface ISystemEvents
{
    event EventHandler<SessionSwitchEventArgs> SessionSwitch;
}
//Pass this implementation to your viewmodel, via the constructor
public class MySystemEvents : ISystemEvents
{
    public event EventHandler<SessionSwitchEventArgs> SessionSwitch
    {
        add { Microsoft.Win32.SystemEvents.SessionSwitch += value; }
        remove { Microsoft.Win32.SystemEvents.SessionSwitch -= value; }
    }
}
public class MyViewModel
{
    public MyViewModel(ISystemEvents systemEvents)
    {
        //Store the instance of your object here, and subscribe to the desired events
    }
}