WPF Prism框架(1) -- 安装和PrismApplication
  JWGppPCsR1pT 2023年11月02日 104 0

Prism

官方文档:Introduction to Prism | Prism (prismlibrary.com)

Prism是一个框架,用于构造松耦合可测试的XAML应用程序(如WPF)。Prism提供了一组实现的设计模式,这些设计模式有助于编写结构良好且可维护的XAML应用程序:

  • MVVM
  • 依赖注入
  • 命令
  • 事件聚合器 ...

容器

针对WPF有两种容器可用:

  • Prism.DryIoc
  • Prism.Unity, 比DryIoc使用市场更大一些

IOC的全称是Inversion of Control(控制反转),意思就是将对象的创建和管理权交给IoC Service Provider(IoC思想的具体实现).

  • 事先将类型注册到一个容器中(containerRegistry.Register<MainWindow>();) .
  • 有多种注册方式,可以是瞬时也对象(containerRegistry.Register<MainWindow>()),也可以是单例( containerRegistry.RegisterSingleton<MainWindow>();),还可以直接注册对象的实例( containerRegistry.RegisterInstance<MainWindow>(new Shell.MainWindow())
    )。
  • 获取时通过反射等手段,获取类型的构造函数并调用创建对象(Container.Resolve<MainWindow>();)
  • 如果构造函数有参数,也是通过Container.Resolve 方法创建参数对象,然后再将创建好的参数对象传递给构造函数。

通过Nuget安装Prism

  • 创建wpf应用程序
  • 工具 》Nuget 包管理器 》解决方案的 NuGet程序包, 在浏览中搜索 Prism.Unity勾选项目安装即可。

PrismApplication

App继承自要PrismApplication,需要修改以下两个地方:

修改App.xaml

<prism:PrismApplication x:Class="Regions.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"
             xmlns:local="clr-namespace:Regions">
    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>
  • 引入prism命名空间 xmlns:prism="http://prismlibrary.com/"
  • 指定Aapp的基类prism:PrismApplication
  •  StartupUri="{xxx}"要删除,否则会弹出两个窗口

修改App.xaml.cs

public partial class App : PrismApplication
 {
     protected override Window CreateShell()
     {
         return Container.Resolve<MainWindow>();
     }

     protected override void RegisterTypes(IContainerRegistry containerRegistry)
     {
         containerRegistry.Register<MainWindow>();
     }
 }

PrismApplication是一个抽像类,需要在App类中实现两个抽象函数

PrismApplication简单分析

public abstract class PrismApplication : PrismApplicationBase
    {
        protected override IContainerExtension CreateContainerExtension()
        {
            return new UnityContainerExtension();
        }
        protected override void RegisterFrameworkExceptionTypes()
        {
            ExceptionExtensions.RegisterFrameworkExceptionType(typeof(ResolutionFailedException));
        }
    }

简单地重载了两个函数...

public abstract class PrismApplicationBase : Application{
         protected override void OnStartup(StartupEventArgs e)
         {
             base.OnStartup(e);
             InitializeInternal();
         }
    }

重载了OnStartup函数

private void InitializeInternal()
{
    // 配置View 和 ViewModel 的定位器
    ConfigureViewModelLocator();
    Initialize();
    // 显示窗口
    OnInitialized();
}
protected virtual void Initialize()
{
    ContainerLocator.SetContainerExtension(CreateContainerExtension);
    _containerExtension = ContainerLocator.Current;
    _moduleCatalog = CreateModuleCatalog();
    RegisterRequiredTypes(_containerExtension);
    // 这是我们实现的抽象函数
    RegisterTypes(_containerExtension);
    _containerExtension.FinalizeExtension();
    ConfigureModuleCatalog(_moduleCatalog);
    RegionAdapterMappings regionAdapterMappings = _containerExtension.Resolve<RegionAdapterMappings>();
    ConfigureRegionAdapterMappings(regionAdapterMappings);
    IRegionBehaviorFactory regionBehaviors = _containerExtension.Resolve<IRegionBehaviorFactory>();
    ConfigureDefaultRegionBehaviors(regionBehaviors);
    RegisterFrameworkExceptionTypes();
    // 我们实现的另一个抽象函数
    Window window = CreateShell();
    if (window != null)
    {
        MvvmHelpers.AutowireViewModel(window);
        RegionManager.SetRegionManager(window, _containerExtension.Resolve<IRegionManager>());
        RegionManager.UpdateRegions();
        InitializeShell(window);
    }

    InitializeModules();
}

说是开源,但有些代码还是看不到,所以只能猜...

Prism WPF示例

GitHub - PrismLibrary/Prism-Samples-Wpf: Samples that demonstrate how to use various Prism features with WPF

这是目前我认为最好的免费学习资料...

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

JWGppPCsR1pT