簡體   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