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中进行区域划分,并为不同的区域添加内容控件:
<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进行注册时绑定:
containerRegistry.RegisterForNavigation<MenuControlView, MenuControlViewModel>();
3.按照命名规则实现自动绑定:
在解决方案内创建Views和ViewModels文件夹,
xaml文件命名为xxxView或者xxx,在.Views命名空间内;
ViewModel命名为xxxViewModel,在.ViewModels命名空间内;
然后在xaml文件设置自动绑定:
xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="True"
怎么实现页面导航:
在MenuViewModel的Command中写入,则mainArea区域会切换HomeView页,‘mainArea’即设置的区域名称,‘HomeView’即对应的xaml名称:
rm.Regions["mainArea"].RequestNavigate("HomeView");
或者
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 }
在导航至本页面处添加参数:
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
发布事件:
EventAggregatorIns.Ins.GetEvent<TestEvent>().Publish(DateTime.Now.ToString());
订阅事件:
EventAggregatorIns.Ins.GetEvent<TestEvent>().Subscribe(DoAction);
其他功能
*区域命名也可在xaml中设置:
<ContentControl x:Name="header" prism:RegionManager.RegionName="header"/>
*控件也可在注册时指定别名:
containerRegistry.RegisterForNavigation<HomeView>("home");
Prism还支持Module模块化,IDialogService对话框,导航日志等功能。