有網友提出需求,在 prism 的 module 中如何彈出對話框?像主界面彈出關於對話框一樣?

關於窗口彈出效果:
效果一般,如果有設計師可以做的很漂亮。
本文不打算寫的很詳細,具體做法可以看源碼(文末附倉庫連結),另外關於 prism 的學習可參考如下文章:
- net core 3.x wpf mvvm 框架 prism 系列(後續版本通用)
https://dotnet9.com/album/wpf-prism
- wpf 企業級開發框架搭建指南(啟示錄),2020 從入門到放棄
https://jhrs.com/2020/37391.html
1 關於對話框如何彈出來的?
1.1通用對話框窗體註冊
App.xaml.cs
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
...
containerRegistry.RegisterDialogWindow<DialogWindow>();//注册自定义对话框窗体
...
}
如上代码,RegisterDialogWindow为注册对话框窗体代码,即所有弹出的对话框是包裹在DialogWindow内的,代码简单我就不贴了,知道他是一个Window就好,具体请看源码:DialogWindow。
1.2實際對話框註冊
也是在 App.xaml.cs 文件中,下面的代码即为注册实际的对话框代码:QQ群对话框、关于对话模式、推荐网站对话框等,括号中的字符串(如"About")用于弹出对话框定位使用,注:实际的对话框是基于UserControl编写的,只有这样才能套入是一个Window的RegisterDialogWindow内。
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
...
containerRegistry.RegisterDialogWindow<DialogWindow>();//注册自定义对话框窗体
containerRegistry.RegisterDialog<QQGroupView, QQGroupViewModel>("QQGroup");
containerRegistry.RegisterDialog<AboutView, AboutViewModel>("About");
containerRegistry.RegisterDialog<WebView, WebViewModel>("Web");
...
}
1.3菜單觸發調出對話框
這個就更簡單了,直接在 xaml 中使用,比如主窗口的關於菜單:
<menuitem
Command="{Binding RaiseShowDialogCommand}"
CommandParameter="About"
Header="{markup:I18n {x:Static i18NResources:Language.About}}"
>
<MenuItem.Icon>
<Path
Width="16"
Data="{StaticResource InfoGeometry}"
Fill="{DynamicResource SuccessBrush}"
/>
</MenuItem.Icon>
</menuitem>
RaiseShowDialogCommand在 VM 的基类ViewModelBase定义的,实际调用代码如下:
/// <summary>
/// 显示对话框
/// </summary>
/// <param name="dlgName"></param>
private void RaiseShowDialogHandler(string dlgName)
{
DialogService.ShowDialog(dlgName);
}
参数dlgName即上面1.2注册对话框时指定的字符串,视情况指定。
2 module 中的對話框如何彈出?
這一節就是本文的重點了。
2.1關鍵:imodule 的 registertypes 方法
Module是动态加载的,模块中的对话框不可能写在App.xaml.cs中噻?如果你对Prism比较熟悉,看看各模块的Module入口类,即继承IModule的模块入口类方法RegisterTypes(IContainerRegistry containerRegistry),可以在这里注入模块使用的类型和对话框,供本模块或者其他模块使用。
2.2模塊對話框實現
以LQClass.ModuleOfLog模块为例,我们在下面注册添加日志对话框:
public void RegisterTypes(IContainerRegistry containerRegistry)
{
...
containerRegistry.RegisterDialog<AddView, AddViewModel>("AddLogView");
...
}
AddView为添加日志视图,和一般用户控件没有区别,可参考关于对话框编写,本项目视图链接见AddView.xaml。
2.3怎麼調用?
调用方式同主窗口菜单一致,代码文件路径:src\LQClass.AdminForWPF\Modules\LQClass.ModuleOfLog\Views,添加按钮声明如下:
<Button
Margin="10,15,10,0"
Style="{StaticResource ButtonSuccess}"
Command="{Binding RaiseShowDialogCommand}"
CommandParameter="AddLogView"
Content="{markup:I18n {x:Static i18NResources:Language.Add}}"/>
命令参数AddLogView即2.2中注册视图时给的名称。
效果如下,只是演示模塊中如何彈出對話框,未加實際業務:
3 關於項目怎麼運行?
说明:本项目服务端基于WTM搭建,客户端由 WPF 编写。
3.1運行服務端
如果需要运行查看客户端效果,请先编译服务端src\LQClass.Admin,至于怎么编译,不会的自行百度哦,编译成功后,调试运行服务端项目,或者双击运行服务端 Exe:src\LQClass.Admin\LQClass.Admin\bin\Debug\net5.0\LQClass.Admin.exe,服务端默认开启 5000 端口。
3.2運行 wpf 客戶端
如果只是看源碼,可以忽略本步驟。
注意查看App.config,客户端连接服务端的地址是否正确:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
...
<add key="API" value="http://localhost:5000/api/"/>
</appSettings>
...
</configuration>
项目路径:src\LQClass.AdminForWPF,生成成功,调试客户端项目,或者双击客户端 Exe:\src\LQClass.AdminForWPF\Build\LQClass.AdminForWPF.exe即可运行本客户端了。
後端默認管理員帳號:
admin
000000
最後來個完整演示:
倉庫(歡迎提 issue):https://github.com/dotnet9/lqclass.com