zoukankan      html  css  js  c++  java
  • 从零开始搭建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

    作者:竹天笑
    互相学习,提高自己。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    SharePoint客户端开发:增加用户信息到用户信息列表
    Query Options的一些用法(5):日历的处理
    User Profile Service卡在Starting的解决方法
    python enumerate用法
    希腊字母的发音
    在Linux下安装go语言环境
    Gradle的安装与使用
    学习正太分布及极差、移动极差、方差、标准差等知识点
    招聘还是炫耀,设计模式是装逼利器?
    Silverlight + RIA Service的SUID的实例。
  • 原文地址:https://www.cnblogs.com/akwkevin/p/15112516.html
Copyright © 2011-2022 走看看