繁体   English   中英

Win32事件+ WPF + MVVM

[英]Win32 events + WPF + MVVM

SystemEvents.SessionSwitch + = new SessionSwitchEventHandler(SystemEvents_SessionSwitch);

我正在构建一个wpf应用程序,它将工作站锁定和解锁之间的时间计算在一起但是我很难实现它而不需要在主窗口代码中放入

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

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专家,我该怎么办? 我是否将它保存在mainwindow代码隐藏中? 或者我可以在XAML中实际引用Win32

和一个侧面问题......计时器逻辑 - 我是否将它保存在单独的类中并将值存储在模型中? 不用说 - 我对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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM