窗口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绑定了。