窗口Loaded事件與Command命令綁定
起因
最近接到一個任務,需要做一系列上位機軟件,功能挺簡單的,應該能完成。但考慮現在已經2022年了,已經兩三年沒摸Winform的我,想趁此機會學習一下大名鼎鼎的WPF,以交付給老板相對現代一點的上位機軟件。
第一個上位機軟件相對比較接單,主要由兩個窗口組成,一個是登錄窗口,一個是主窗口。
搞登錄窗口
是我想簡單了
由於現在企業內已經普及了企業微信,且上位機對操作人員也是有登錄要求的,所以我准備模仿微信的登錄方式,二維碼登錄!那對於登錄窗口來說,無非是Loaded事件中請求api,獲取到一個識別code,顯示到窗口的image控件中,然后操作端的員工通過企業微信掃碼,再通過OAuth2識別出哪個員工,客戶端上再獲取到對應的信息,實現登錄過程。但在試試的過程中,遇到的一個問題竟然是:Loaded與WPF的Command如何綁定?
想起用單身二十幾年的手速拖winform控件的那會兒,窗口的loaded事件不就是鼠標雙擊窗口,然后就是loaded事件生成了嗎?(不得不說,拖控件真爽啊,可潮流趨勢它來了,誰也擋不住!)我依樣畫葫蘆,去WPF的LoginWindow.xaml中加了一個Loaded事件:
<Window x:Class="Deamon.Views.LoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Deamon.Views"
mc:Ignorable="d"
Title="LoginWindow"
WindowStyle="None"
WindowStartupLocation="CenterScreen"
WindowState="{Binding WindowStateValue,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Height="360"
Width="290"
Loaded="LoginWindow_OnLoaded"
>
而LoginWindow_OnLoaded事件就是:
private void LoginWindow_OnLoaded(object sender, RoutedEventArgs e)
{
//登錄窗口顯示了
}
這不是和winform一樣簡單嗎?
那我接下去只要在這個事件中調用service層,請求API,獲取數據,更新到對應的ViewModel中, 那二維碼不就實現了嗎?
進一步思考
由於WPF帶來的是我們現在經常使用的MVVM思想,也就是要求數據和視圖要求分離的,松耦合。那我如果還是在LoginWindow.cs中編寫請求數據操作,然后再賦給vm,這樣又破壞了mvvm的相關原則,所以又問了百度親娘和Google阿爹。果然,高手在搜索引擎中,
操作步驟
先nuget上下載Microsoft.Xaml.Behaviors.Wpf這個包,然后在xaml中引用命名空間:```csharp
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
然后xaml中的window中加入
```csharp
<b:Interaction.Triggers>
<b:EventTrigger EventName="Loaded">
<b:InvokeCommandAction Command="{Binding LoadedWindowCommand}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
其中LoadedWindowCommand就是我在此窗口對應的vm中寫好的command,這樣就可以實現原本WPF中不能觸發的Loaded的事件與Command綁定了。