1-6注册View Prism官网案例学习
声明
原文出处如下:
这是一篇记录作者学习Prism的随笔,该随笔的内容是作者通过5个资源学习汇总而成,主要是为了方便自己以后拾遗温习所用,如果文中内容看不懂,推荐直接阅读相关原文。
Prism官网案例学习
01-创建一个基本的引导程序和外壳
引入命名空间
- 导航到App.xaml然后将标准WPF应用程序类替换为Prism
PrismApplication
类。 - 不要忘记StartupUri从
PrismApplication
标记中删除属性。否则,您将获得两个窗口实例。
<prism:PrismApplication
x:Class="WpfApp1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1"
xmlns:prism="http://prismlibrary.com/">
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
继承抽象方法
导航到App.xaml.cs中并更新类定义,PrismApplication首先定义了一对抽象方法:RegisterTypes和CreateShell。
RegisterTypes-注册类型(依赖注入)
CreateShell-入口函数
必须实现的第二种方法是CreateShell方法。这是将创建应用程序主窗口的方法。应该使用App类的Container属性来创建窗口,因为它可以处理所有依赖项。
02 03-Regions
Regions-创建一个区域
Regions是应用程序UI的逻辑区域,它很像一个PlaceHolder,Views在Regions中展现,很多种控件可以被用作Region :ContentControl、ItemsControl、ListBox、TabControl。
简单的说,就是一个容器(区域适配器),用来装载Views的。这像WinForms中的Container控件Panel,里面可以放置其他控件。在PRISM中,Views也是用户控件(UserControl)
参考05-Prism系列之区域管理器
<ContentControl Grid.Row="2" prism:RegionManager.RegionName="PatientListRegion" Margin="10"/>
//后台代码:RegionManager.SetRegionName(ContentControl, "PatientListRegion");
Custom Region Adapter- 为StackPanel创建一个自定义区域适配器
-
创建自定义适配器,继承 RegionAdapterBase
,实现对应方法 using Prism.Regions; using System.Windows; using System.Windows.Controls; namespace Regions { public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel> { public StackPanelRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory) { } protected override void Adapt(IRegion region, StackPanel regionTarget) { region.Views.CollectionChanged += (s, e) => { if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) { foreach (FrameworkElement element in e.NewItems) { regionTarget.Children.Add(element); } } //handle remove }; } protected override IRegion CreateRegion() { return new AllActiveRegion(); } } }
-
注册映射
-
为控件创建区域
-
为区域注入视图
04 05 06 - 注册View
视图注册的两种方法
我们可以明显的感觉到两种方式的不同,ViewDiscovery方式是自动地实例化视图并且加载出来,而ViewInjection方式则是可以手动控制注入视图和加载视图的时机(上述例子是通过Loaded事件),官方对于两者的推荐使用场景如下:
ViewDiscovery:
- 需要或要求自动加载视图
- 视图的单个实例将加载到该区域中
ViewInjection:
- 需要显式或编程控制何时创建和显示视图,或者您需要从区域中删除视图
- 需要在区域中显示相同视图的多个实例,其中每个视图实例都绑定到不同的数据
- 需要控制添加视图的区域的哪个实例
- 应用程序使用导航API(后面会讲到)
View Discovery-注册方法一:使用View Discovery自动注入视图
-
创建用户视图ViewA
-
注册视图
public MainWindow(IRegionManager regionManager) { InitializeComponent(); //view discovery 注册视图 regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA)); }
View Injection-注册方法二:使用View Injection手动添加和删除视图
namespace ViewInjection.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml MainWindow.xaml的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
IContainerExtension _container; //声明对应字段
IRegionManager _regionManager;//声明对应字段
public MainWindow(IContainerExtension container, IRegionManager regionManager)
{
InitializeComponent();
_container = container;
_regionManager = regionManager;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//手动注册
var view = _container.Resolve<ViewA>();
IRegion region = _regionManager.Regions["ContentRegion"];
region.Add(view);
}
}
}
View Activation/Deactivation- 手动激活和停用视图
using Unity;
using Prism.Regions;
using System.Windows;
using Prism.Ioc;
namespace ActivationDeactivation.Views
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
IContainerExtension _container; //容器扩展
IRegionManager _regionManager;//区域管理器
IRegion _region;//区域
ViewA _viewA;//视图A
ViewB _viewB;//视图B
public MainWindow(IContainerExtension container, IRegionManager regionManager)
{
InitializeComponent();
_container = container;
_regionManager = regionManager;
this.Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
_viewA = _container.Resolve<ViewA>();//解析视图A
_viewB = _container.Resolve<ViewB>();//解析视图B
_region = _regionManager.Regions["ContentRegion"];//区域管理器
_region.Add(_viewA);//添加视图
_region.Add(_viewB);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//activate view a
_region.Activate(_viewA);//区域 活性化 视图A
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
//deactivate view a
_region.Deactivate(_viewA); //区域 使不活性化 视图A
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
//activate view b
_region.Activate(_viewB);
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
//deactivate view b
_region.Deactivate(_viewB);
}
}
}
登峰造极的成就源于自律