WPF的Prism框架简单应用
Prism主要用于页面的切换导航,UI界面通常分为几个区域:Header顶部区域;Menu菜单区域,Home主界面区域;
下面是使用步骤:
首先安装Prism框架或引用Dll:
对App.xaml和xaml.cs进行修改:
将Application改为prism:PrismApplication,取消此处指定开始页面StartupUri;

1 <prism:PrismApplication x:Class="PrismDemo.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:prism="http://prismlibrary.com/"> 5 <!--StartupUri="MainWindow.xaml">--> 6 <Application.Resources> 7 </Application.Resources> 8 </prism:PrismApplication>
将App改为继承自PrismApplication,并实现其抽象函数;CreateShell返回开始窗体即StartupUri;

1 public partial class App : PrismApplication 2 { 3 protected override Window CreateShell() 4 { 5 return Container.Resolve<MainWindow>(); 6 } 7 8 protected override void RegisterTypes(Prism.Ioc.IContainerRegistry containerRegistry) 9 { 10 containerRegistry.RegisterForNavigation<HomeView>(); 11 containerRegistry.RegisterForNavigation<HeaderControlView>(); 12 containerRegistry.RegisterForNavigation<MenuControlView>(); 13 } 14 }
对主窗体MainWindow进行修改:
xaml中进行区域划分,并为不同的区域添加内容控件:
1 2 3 | <Border Grid.Row= "0" BorderThickness= "0 1 0 1" BorderBrush= "Gray" > <ContentControl x:Name= "header" /> </Border> |
在xaml.cs中为区域命名,并为区域注册初始控件:
构造函数添加参数(IRegionManager regionManager);
RegionManager.SetRegionName 区域命名;regionManager.RegisterViewWithRegion 注册控件;
注册的控件需在App.xaml.cs的RegisterTypes函数中进行注册;

1 public MainWindow(IRegionManager regionManager) 2 { 3 InitializeComponent(); 4 RegionManager.SetRegionName(header, "header"); 5 RegionManager.SetRegionName(menu, "menu"); 6 RegionManager.SetRegionName(main, "mainArea"); 7 regionManager.RegisterViewWithRegion("header", typeof(HeaderControlView)); 8 regionManager.RegisterViewWithRegion("menu", typeof(MenuControlView)); 9 regionManager.RegisterViewWithRegion("mainArea", typeof(HomeView)); 10 }
此时启动程序,各控件已显示在对应区域;
Prism的MVVM:
ViewModel继承BindableBase,支持RaisePropertyChanged();
DelegateCommand负责命令绑定;
View和ViewModel怎么绑定:
1.可使用传统方式在View的构造函数中写入:This.DataContext = new ViewModel();
2.在App.xaml.cs的RegisterTypes进行注册时绑定:
1 | containerRegistry.RegisterForNavigation<MenuControlView, MenuControlViewModel>(); |
3.按照命名规则实现自动绑定:
在解决方案内创建Views和ViewModels文件夹,
xaml文件命名为xxxView或者xxx,在.Views命名空间内;
ViewModel命名为xxxViewModel,在.ViewModels命名空间内;
然后在xaml文件设置自动绑定:
1 2 | xmlns:prism= "http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel= "True" |
怎么实现页面导航:
在MenuViewModel的Command中写入,则mainArea区域会切换HomeView页,‘mainArea’即设置的区域名称,‘HomeView’即对应的xaml名称:
1 | rm.Regions[ "mainArea" ].RequestNavigate( "HomeView" ); |
或者
1 | rm.RequestNavigate( "mainArea" , "HomeView" ); |
页面参数传递:
在View.cs或ViewModel.cs继承接口,INavigationAware,并实现其接口函数:

1 public bool IsNavigationTarget(NavigationContext navigationContext) 2 { 3 return true; 4 } 5 public void OnNavigatedFrom(NavigationContext navigationContext) 6 { 7 //导航离开本页面触发 8 } 9 public void OnNavigatedTo(NavigationContext navigationContext) 10 { 11 //导航进入本页面触发,获取Key为Parameter的参数值 12 string value = navigationContext.Parameters.GetValue<string>("Parameter"); 13 TxtParameter = value; 14 }
在导航至本页面处添加参数:
1 2 3 | var par = new NavigationParameters(); par.Add( "Parameter" , "Hello.Prism!" ); rm.Regions[ "mainArea" ].RequestNavigate( "HomeView" , par); |
事件聚合器
建立一个事件类,在订阅和发布函数中绑定它,可实现不同区域内信息或命令传递;

1 public class EventAggregatorIns 2 { 3 private static IEventAggregator _ins; 4 public static IEventAggregator Ins 5 { 6 get { return _ins ?? (_ins = new EventAggregator()); } 7 } 8 } 9 /// <summary> 10 /// 事件聚合器类 11 /// </summary> 12 public class TestEvent : PubSubEvent<string> 13 {} 14
发布事件:
1 | EventAggregatorIns.Ins.GetEvent<TestEvent>().Publish(DateTime.Now.ToString()); |
订阅事件:
1 | EventAggregatorIns.Ins.GetEvent<TestEvent>().Subscribe(DoAction); |
其他功能
*区域命名也可在xaml中设置:
1 | <ContentControl x:Name= "header" prism:RegionManager.RegionName= "header" /> |
*控件也可在注册时指定别名:
1 | containerRegistry.RegisterForNavigation<HomeView>( "home" ); |
Prism还支持Module模块化,IDialogService对话框,导航日志等功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?