前端跨平台UI组件【免费下载链接】PrismPrism is a framework for building loosely coupled, maintainable, and testable XAML applications in WPF, Xamarin Forms, and Uno / Win UI Applications..项目地址https://gitcode.com/gh_mirrors/pri/Prism点击查看免费下载本文以 README.md 为主线结合本仓库的源码与工程配置全面讲解 Prism 的定位、核心设计模式、多平台支持、NuGet 包体系、授权模式与示例资源。读者将掌握 Prism 在 WPF、Avalonia、.NET MAUI、Uno Platform 等平台上的选型方法、包依赖关系、应用启动流程与 MVVM/DI/命令/事件聚合四大基础能力的底层原理。一、Prism 是什么Prism 是一个用于构建**松耦合loosely coupled、可维护maintainable、可测试testable**的 XAML 应用程序的框架覆盖 WPF、Avalonia、.NET MAUI、Uno Platform 与 WinUI 五大平台。每个平台都有独立的发行版本并按各自的节奏独立演进见 README.md。Prism 提供了一整套有助于编写结构良好、易于维护的 XAML 应用的设计模式实现主要包括MVVMModel-View-ViewModel依赖注入Dependency Injection命令CommandsEventAggregator事件聚合器以及导航Navigation、区域Regions、模块化Modularity、**对话框Dialogs**等配套能力Prism 的核心功能是跨平台共享的代码库支持 .NET Standard 2.0、.NET Framework 4.6/4.7 以及 .NET 6.0/.NET 8.0本仓库当前版本已进一步扩展到 net8.0/net9.0/net10.0见下文源码分析。需要平台特定的功能则在各目标平台的对应库中实现同时 Prism 提供了这些设计模式与目标平台的深度集成。二、架构与源码结构从仓库目录结构见 PrismLibrary.slnx可以清晰看出 Prism 的核心 平台分层架构src/ ├── Prism.Core/ # 跨平台核心MVVM、Commands、Modularity、Navigation.Regions、Dialogs ├── Prism.Events/ # 事件聚合器EventAggregator / PubSubEvent ├── Avalonia/ # Prism.Avalonia、Prism.DryIoc.Avalonia ├── Maui/ # Prism.Maui、Prism.DryIoc.Maui、Prism.Maui.Rx ├── Uno/ # Prism.Uno、Prism.DryIoc.Uno、Prism.Uno.Markup └── Wpf/ # Prism.Wpf、Prism.DryIoc.Wpf、Prism.Unity.Wpf测试代码按平台分布在 tests 目录下端到端示例应用位于 e2e 目录分别有 Wpf、Avalonia、Maui、Uno 四套 demo。2.1 核心库 Prism.Coresrc/Prism.Core/Prism.Core.csproj 声明的目标框架为TargetFrameworksnet462;net47;net8.0;net9.0;net10.0/TargetFrameworks它同时引用 src/Prism.Events/Prism.Events.csproj 与Prism.Container.Abstractions包并输出程序集名Prism、包名Prism.Core。这印证了 README 中核心功能是共享代码库的表述——它不依赖任何特定应用框架凡是需要平台特异的部分都下沉到各平台库中实现。2.2 平台库与共享源码机制平台库通过**编译期文件链接Compile Include ... LinkBase**复用 WPF 库的源码这是 Prism 保持多平台行为一致性的关键机制src/Avalonia/Prism.Avalonia/Prism.Avalonia.csproj 直接以LinkBase方式链入..\..\Wpf\Prism.Wpf下的MvvmHelpers.cs、DialogViewRegistry.cs、Modularity\*.cs、Mvvm\*.cs、Navigation\Regions\**\*.cs等文件同时排除少数 WPF 专用实现如InvokeCommandAction.cs、XamlModuleCatalog.cs。src/Uno/Prism.Uno/Prism.Uno.WinUI.csproj 同样以Compile Include..\..\Wpf\Prism.Wpf\**\*.cs方式整体链入 WPF 源码并额外引入 MAUI 的Modularity\*.cs。也就是说WPF 库中的 Regions、Modularity、Mvvm 等源码是 Avalonia 与 Uno 平台的共享物理源文件——从源码结构可以推断这正是 Prism 宣称核心功能共享、平台功能独立实现的工程落地方式。三、核心设计模式与源码印证3.1 MVVM 与 BindableBasesrc/Prism.Core/Mvvm/BindableBase.cs 实现了INotifyPropertyChanged提供两个SetPropertyT重载第一个重载通过EqualityComparerT.Default.Equals(storage, value)先判断值是否变化仅在变化时才赋值并触发RaisePropertyChanged第二个重载额外接受Action? onChanged回调在属性变更后、通知之前执行RaisePropertyChanged与OnPropertyChanged均支持[CallerMemberName]自动获取属性名。public abstract class BindableBase : INotifyPropertyChanged { protected virtual bool SetPropertyT(ref T storage, T value, [CallerMemberName] string? propertyName null) { if (EqualityComparerT.Default.Equals(storage, value)) return false; storage value; RaisePropertyChanged(propertyName); return true; } }3.2 ViewModel 定位与自动装配src/Prism.Core/Mvvm/ViewModelLocationProvider.cs 的AutoWireViewModelChanged按以下优先级解析 ViewModel已注册的工厂/映射_factories/_typeFactories平台提供的 View → ViewModel 解析器如 MAUI 的附加属性ViewModelProperty约定式推断默认解析器DefaultViewTypeToViewModel见 L83-L95将Namespace.Views.XXXView映射为Namespace.ViewModels.XXXViewModel——把.Views.替换为.ViewModels.视图名以View结尾时追加Model否则追加ViewModel。从源码看Prism 对Native AOTTrim 场景也做了适配通过Prism.Mvvm.ReflectionBasedViewModelLocationEnabled开关L60-L62控制是否回退到反射创建且支持ContainerAot.TryGetImplementationType获取由 Prism 容器生成器保留的类型避免 AOT 下反射失效。3.3 命令DelegateCommand / CompositeCommandsrc/Prism.Core/Commands/DelegateCommandBase.cs 是所有 DelegateCommand 的基类关键设计点包括同时实现ICommand与IActiveAwareIsActive变化会触发IsActiveChanged事件L110-L135ObservesPropertyInternalTL96-L108通过PropertyObserver观察指定属性属性变化时自动调用RaiseCanExecuteChanged从而省去手动刷新的样板代码OnCanExecuteChangedL45-L55会在 UI 线程同步上下文与当前线程不一致时通过SynchronizationContext.Post将事件调度回创建命令时的线程内置MulticastExceptionHandler用于集中处理命令执行中抛出的异常。配合 src/Prism.Core/Commands 目录下的DelegateCommandT、AsyncDelegateCommand、CompositeCommand等类型可以覆盖同步/异步、带参/无参、多命令编排等场景。3.4 EventAggregator 事件聚合src/Prism.Events/EventAggregator.cs 维护一个DictionaryType, EventBaseGetEventTEventType()保证同一事件类型在整个应用中是单例且内部使用lock保证线程安全。它还捕获构造时的SynchronizationContext以便在 UI 线程与后台线程之间正确调度。src/Prism.Events/PubSubEvent.cs 定义了三种线程选项ThreadOption.csThreadOption说明底层实现PublisherThread在发布者线程同步回调默认EventSubscriptionBackgroundThread在线程池线程异步回调BackgroundEventSubscriptionUIThread调度到 UI 同步上下文DispatcherEventSubscription若 EventAggregator 非在 UI 线程构造会抛出异常订阅默认使用WeakReference引用订阅者DelegateReference避免内存泄漏当keepSubscriberReferenceAlive为true时改为强引用此时必须显式Unsubscribe。泛型版本PubSubEventTPayload还支持filter谓词过滤L254-L285。四、多平台支持与 NuGet 包体系4.1 包分类总览README 将 Prism 的 NuGet 包分为两大类① 核心包Core Packages——各平台的基础包加上作为跨平台 PCL 的 Prism.Core 程序集平台包跨平台Prism.Core跨平台Prism.Events跨平台Prism.Container.Abstractions跨平台Prism.Container.DryIoc跨平台Prism.Container.UnityWPFPrism.WpfAvaloniaPrism.Avalonia.NET MAUIPrism.MauiUno Platform / WinUIPrism.Uno即 Prism.Uno.WinUI② 容器专用包Container-specific packages——每个受支持的 IoC 容器都有独立包辅助配置与使用程序集命名约定为Prism.*Container.Platform*.dll例如Prism.Unity.Wpf.dllWPFPrism.DryIoc、Prism.UnityAvaloniaPrism.DryIoc.Avalonia.NET MAUIPrism.Maui、Prism.DryIoc.Maui、Prism.Maui.Rx基于 System.Reactive 的全局导航观察器见 src/Maui/Prism.Maui.RxUno PlatformPrism.DryIoc.Uno自 Prism 7.0 起Prism 开始为每个平台提供独立包。安装时务必同时选择容器包与平台包详见 README.md。仓库根目录 images/NuGetPackageTree.png 展示了各包之间的依赖树关系4.2 从工程文件印证平台目标框架各平台库的 csproj 实际声明本仓库当前代码如下平台库目标框架关键依赖src/Wpf/Prism.Wpf/Prism.Wpf.csprojnet462;net47;net8.0-windows;net9.0-windows;net10.0-windowsUseWPFtrueMicrosoft.Xaml.Behaviors.Wpf、Prism.Coresrc/Avalonia/Prism.Avalonia/Prism.Avalonia.csprojnet9.0;net10.0Avalonia 12.1.1、Avalonia.Markup.Xaml.Loader、Prism.Coresrc/Maui/Prism.Maui/Prism.Maui.csprojnet10.0;net10.0-android;net10.0-ios;net11.0;net11.0-android;net11.0-iosWindows 上追加net10.0-windows10.0.19041等Microsoft.Maui.Controls、Prism.Coresrc/Uno/Prism.Uno/Prism.Uno.WinUI.csproj$(UnoTargetFrameworks)Uno.Sdk 提供Uno.WinUI、Uno.Extensions.Hosting.WinUI、Prism.Core包版本由仓库根目录 Directory.Packages.propsCentral Package Management统一管理例如Avalonia12.1.1、Microsoft.Maui.Controls10.0.10 / 11.0.0-rc.1 等当前仓库version.json标识的版本为10.0-pre。五、各平台的启动与初始化方式5.1 WPFPrismApplicationBase 初始化流程src/Wpf/Prism.Wpf/PrismApplicationBase.cs 的InitializeInternal依次执行ConfigureViewModelLocator() → Initialize() → OnInitialized()而Initialize()内部是完整有序的启动管线ContainerLocator.SetContainerExtension(CreateContainerExtension())—— 创建并注册容器CreateModuleCatalog()—— 默认返回ModuleCatalogRegisterRequiredTypes/RegisterTypes—— 注册框架必需类型与应用类型ConfigureModuleCatalog(moduleCatalog)—— 配置模块目录ConfigureRegionAdapterMappings/ConfigureDefaultRegionBehaviors—— 配置区域适配器与默认区域行为RegisterFrameworkExceptionTypes—— 注册框架异常类型CreateShell()→MvvmHelpers.AutowireViewModel(shell)→ 挂载IRegionManager并RegionManager.UpdateRegions()→InitializeShell(shell)InitializeModules()—— 通过RunModuleManager初始化模块。典型 WPF 应用只需覆写三个成员见 e2e/Wpf/HelloWorld/App.xaml.cspublic partial class App { protected override Window CreateShell() { return Container.ResolveMainWindow(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterSharedSamples(); } protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModuleModuleAModule(); } }5.2 .NET MAUIPrismAppBuilder 链式配置MAUI 平台使用UsePrismPrismAppBuilder的流式 API。src/Maui/Prism.Maui/PrismAppBuilder.cs 提供的关键扩展点包括RegisterTypes(ActionIContainerRegistry)注册服务OnInitialized(ActionIContainerProvider)应用初始化完成回调CreateWindow(FuncIContainerProvider, INavigationService, Task)指定初始导航ConfigureRegionAdapters/ConfigureRegionBehaviors配置区域适配器与行为回调按注册顺序累积执行。初始化在 OnInitialized() 内分为三个阶段执行先配置 Module Catalog再运行IModuleManager初始化模块此时模块的服务才可用最后执行用户的 OnInitialized 委托若INavigationRegistry未注册NavigationPage/TabbedPage会自动注册PrismNavigationPage与TabbedPage。参考 e2e/Maui/PrismMauiDemo/MauiProgram.cs 的完整用法public static MauiApp CreateMauiApp() { return MauiApp.CreateBuilder() .UseMauiAppApp() .UsePrism(prism prism.ConfigureModuleCatalog(moduleCatalog { moduleCatalog.AddModuleMauiAppModule(); moduleCatalog.AddModuleMauiTestRegionsModule(); }) .RegisterTypes(containerRegistry { containerRegistry.RegisterForNavigationMainPage, MainPageViewModel(); containerRegistry.RegisterForNavigationBindingLabPage, BindingLabViewModel(BindingLab); // ... }) .CreateWindow(navigationService navigationService.CreateBuilder() .AddSegmentSplashPageViewModel() .NavigateAsync(HandleNavigationError)) ) .Build(); }5.3 Avalonia 与 UnoAvalonia同样以PrismApplicationBase为基类src/Avalonia/Prism.Avalonia/PrismApplicationBase.cs端到端 demo 见 e2e/Avalonia/PrismAvaloniaDemo涵盖 Dashboard、Dialog、Settings 等页面与 RegionNames。Uno使用PlaygroundApplicatione2e/Uno/HelloWorld/App.xaml.cs通过ConfigureHost(IHostBuilder)接入通用主机、Serilog 日志并覆写CreateShell、RegisterTypes、ConfigureModuleCatalog等成员ConfigureWindow中可在 DEBUG 下启用window.UseStudio()。六、模块化Modularity模块化是 Prism 拆分大型应用为独立功能单元的核心机制。src/Prism.Core/Modularity/ModuleCatalogBase.cs 说明每个模块由IModuleInfo描述记录模块的名称、类型与位置目录在内部会校验自身合法性不允许循环依赖Circular dependencies、缺失依赖Missing dependencies或无效依赖如启动加载的模块依赖了需要动态检索的模块IModuleCatalog同时容纳IModuleInfo与IModuleInfoGroup模块分组能力来自 src/Prism.Core/Modularity/IModuleInfoGroup.cs。WPF 端还可使用ConfigurationModuleCatalogApp.config、DirectoryModuleCatalog按目录扫描、XamlModuleCatalog等多种目录实现见 e2e/Wpf/HelloWorld/App.xaml.cs 中的切换注释。模块的实现类只需实现IModule接口例如 e2e/Wpf/Modules/HelloWorld.Modules.ModuleA/ModuleAModule.cs。七、许可模式LicensingREADME 与 src/ReadMe.md 明确指出Prism 9.0 起采用双重许可Dual LicenseLICENSE 为完整许可文件许可类型适用对象说明Community License免费大部分社区用户需同时满足年收入低于 100 万美元开发者人数少于 5 人从未从外部如私募/风投获得超过 300 万美元融资。必须同意 Prism 的全部条款与条件Commercial License商业许可不满足社区许可条件的大型组织需购买用于资助与支持 Prism 的持续开发Commercial Plus License商业许可用户额外获得基于 Prism 构建的支持库以及可向 Prism 团队提问、互动的私有 Discord 频道Commercial Plus Feed 会随每次合并的 PR 更新包可第一时间体验新功能或修复仓库工程文件也反映了这一策略Directory.Build.props 将PackageLicenseFile指向 LICENSE并设置PackageRequireLicenseAcceptancetrue即安装包时必须接受许可。八、构建状态与 CIREADME 的 Build Status 表格列出了六条 GitHub Actions 工作流对应的构建徽章Full Build、Prism.Core、Prism.Wpf、Prism.Avalonia、Prism.Uno、Prism.Maui。仓库侧面的支撑设施包括解决方案文件 PrismLibrary.slnx 及按平台拆分过滤的PrismLibrary_Core.slnf、PrismLibrary_Wpf.slnf、PrismLibrary_Avalonia.slnf、PrismLibrary_Maui.slnf、PrismLibrary_Uno.slnf可按平台单独构建根目录 global.json 固定 SDK 版本xunit.runner.json 配置单元测试运行参数测试工程覆盖各平台如 tests/Prism.Core.Tests、tests/Wpf/Prism.Wpf.Tests、tests/Maui/Prism.Maui.Tests 等。九、示例Samples与学习资源仓库内端到端应用e2e/README.md 说明这些应用用于本地测试、开发以及部分 CI 中的 UI 测试集成验证主要用于让团队验证功能不一定是演示最佳实践的示例更完整、稳定的示例在 PrismLibrary 组织下的独立仓库中基于已发布的 NuGet 包提供。仓库内四套平台 demoWPFe2e/Wpf/HelloWorld含对话框、模块目录、多 Shell 等演示Avaloniae2e/Avalonia/PrismAvaloniaDemoDashboard、DialogSample、Settings 等.NET MAUIe2e/Maui/PrismMauiDemoBindingLab、Region 导航等另有 NativeAotValidation 说明文件Unoe2e/Uno/HelloWorldBindingLab、DialogLab、RegionLab 等。文档README 提示官方文档维护在 Prism-Documentation 仓库的 /docs 下并发布在文档网站上。支持渠道GitHub Discussions 用于一般问题与支持Issues 用于提交缺陷与功能请求商业支持可联系 Prism 团队邮箱。README 特别注明Prism 团队已不再支持或回复 StackOverflow 上的提问。十、总结Prism 通过共享核心 平台独立库 容器适配包的三层设计让同一套 MVVM、依赖注入、命令、事件聚合、导航、区域与模块化心智模型可以复用到 WPF、Avalonia、.NET MAUI、Uno Platform 与 WinUI 之上。仓库源码进一步证实了其工程机制Prism.Core不依赖任何应用框架、Prism.Events提供线程安全的弱引用事件聚合、各平台库通过编译期文件链接复用 WPF 的 Regions/Modularity/Mvvm 实现而容器层则通过Prism.DryIoc.*、Prism.Unity.Wpf等独立包按需接入。选型建议先确定目标平台选择对应的平台包如Prism.Avalonia再按 IoC 容器偏好选择容器包如Prism.DryIoc.Avalonia同时注意 Prism 9.0 之后的许可模式要求。更深入的主题导航参数、区域适配器、对话框服务、模块生命周期等可以直接阅读本仓库对应源码目录或在各平台的 e2e demo 中查看完整可用示例。赞分享前端跨平台UI组件【免费下载链接】PrismPrism is a framework for building loosely coupled, maintainable, and testable XAML applications in WPF, Xamarin Forms, and Uno / Win UI Applications..项目地址https://gitcode.com/gh_mirrors/pri/Prism点击查看免费下载相关推荐Prism跨平台开发终极指南WPF、Avalonia、MAUI全解析Prism跨平台开发终极指南WPF、Avalonia、MAUI全解析 Prism框架是构建现代化、可维护的跨平台应用程序的 完整解决方案 无论你是开发Win前端跨平台UI组件探索高效开发Prism-Samples-WPF —— 一个强大的WPF应用框架探索高效开发Prism Samples WPF —— 一个强大的WPF应用框架 ! https://gitcode.net/prismlibrary/pris示例工程PowerToys WPF与WinUI现代化桌面应用UI框架选择PowerToys WPF与WinUI现代化桌面应用UI框架选择 引言Windows桌面应用UI框架的演进挑战 在Windows桌面应用开发领域UI框架的桌面应用开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?