從零開始搭建Wpf基礎篇4-使用Prism進行模塊化


前言:使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM