前言:使用prism实现模块化
第一步:将App继承Application改成继承PrismApplication,App.xaml中的启动界面StartupUri需要删掉,改在CreateShell中创建并启动主窗口。
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
var window = Container.Resolve<MainWindow>();
return window;
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
}
<prism:PrismApplication x:Class="AIStudio.Wpf.Client.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</prism:PrismApplication>
运行,可以看到和之前一样的效果。
第二步:ConfigureViewModelLocator内实现了View和ViewModel的自动关联,只要View放在Views文件夹里,ViewModel放在ViewModels。然后删除MainWindow.xaml.cs中的 this.DataContext = new MainWindowViewModel()和删除IntroduceView.xaml.cs中的 this.DataContext = new IntroduceViewModel();
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();//默认方法
ViewModelLocationProvider.Register<MainWindow, MainWindowViewModel>();//一些不符合默认关联的,可以在这里写
}
//自动绑定的界面需要加上代码
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
注:View和ViewModel的关联就是按照名字和路径去匹配的,有兴趣的可以去看源码。 运行,还是可以看到和之前一样的效果。
第三步:Region视图注入
添加MainWindowModule模块文件,MainContentRegion区域自动注入LoginView,另外注册可切换的视图IntroduceView。
public class MainWindowModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
var regionManager = containerProvider.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("MainContentRegion", typeof(LoginView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<IntroduceView>();
}
}
在App里面加载MainWindowModule模块
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
var mainWindowModule = typeof(MainWindowModule);
moduleCatalog.AddModule(new ModuleInfo()
{
ModuleName = mainWindowModule.Name,
ModuleType = mainWindowModule.AssemblyQualifiedName,
InitializationMode = InitializationMode.WhenAvailable
});
}
第四步:定义区域部分:MainView的内容控件ContentControl不在实现Template切换,交给prism去干,定义区域名称MainContentRegion,如下:
<mah:MetroWindow x:Class="AIStudio.Wpf.Client.MainWindow"
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:AIStudio.Wpf.Client"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d"
xmlns:prism="http://prismlibrary.com/"
Title="AIStudio.Wpf.Client" Height="450" Width="800">
<Grid>
<ContentControl prism:RegionManager.RegionName="MainContentRegion"/>
</Grid>
</mah:MetroWindow>
好了,这个时候可以运行一下看效果。登录成功后,发现没有自动跳转,现在来实现跳转。
第五步:MainWindowViewModel里面的逻辑已经没有用了,可以都删掉。将LoginViewModel中的改成如下:
public class LoginViewModel : BindableBase
{
IContainerExtension _container;
IRegionManager _regionManager;
public LoginViewModel(IContainerExtension container, IRegionManager regionManager)
{
_container = container;
_regionManager = regionManager;
}
private string _userName;
public string UserName
{
get { return _userName; }
set
{
SetProperty(ref _userName, value);
}
}
private string _password;
public string Password
{
get { return _password; }
set
{
SetProperty(ref _password, value);
}
}
private bool _isRmembered = true;
public bool IsRmembered
{
get { return _isRmembered; }
set
{
SetProperty(ref _isRmembered, value);
}
}
private ICommand _loginCommand;
public ICommand LoginCommand
{
get
{
return this._loginCommand ?? (this._loginCommand = new DelegateCommand(() => this.Login()));
}
}
private void Login()
{
if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password))
{
MessageBox.Show("登录成功!");
_regionManager.RequestNavigate("MainContentRegion", nameof(IntroduceView));
}
else
{
MessageBox.Show("请输入用户名或密码!");
}
}
}
核心代码: _regionManager.RequestNavigate("MainContentRegion", nameof(IntroduceView));直接就将登录界面切换到了介绍界面。 好了,可以运行看效果了,和之前一样的效果。大功告成,代码少了很多啊,这就是使用prism的强大。
后续:下一章将实现,主菜单及主界面。
源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-client.-stepby-step
Prism相关推荐文章:.NET Core 3 WPF MVVM框架 Prism系列之区域管理器
另外推荐一下我的Wpf客户端框架:https://gitee.com/akwkevin/aistudio.-wpf.-aclient