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.xaml

将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     }
App.xaml.cs

对主窗体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         }    
MainView构造函数

此时启动程序,各控件已显示在对应区域;

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         }    
INavigationAware

在导航至本页面处添加参数:

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    
EventAggregator

发布事件:

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对话框,导航日志等功能。

posted @ 2024-11-18 15:21  [春风十里]  阅读(5)  评论(0编辑  收藏  举报