WPF Prism ViewDiscovery

ViewDiscovery介绍

在 WPF Prism 应用程序中,View Discovery 是一个用于发现和注册视图(View)的机制。它允许您将视图与特定的区域(Region)相关联,并在运行时自动将视图添加到该区域中。

以下是 View Discovery 的一些关键概念:

  1. 区域(Region):区域是 UI 中的一个逻辑部分,用于容纳视图。例如,主窗口的左侧面板可以是一个区域,右侧面板可以是另一个区域。
  2. 视图(View):视图是用户界面的一个部分,通常实现为一个 UserControl 或一个自定义控件。
  3. 视图发现(View Discovery):视图发现是指在运行时自动发现和注册视图的过程。

Prism 提供了以下几种视图发现机制:

  1. 显式注册(Explicit Registration):您可以在代码中显式注册视图,将其与特定的区域相关联。
  2. 自动发现(Auto-Discovery):Prism 可以自动发现视图,并将其注册到相应的区域中。
  3. 基于约定的发现(Convention-based Discovery):您可以定义一个约定,用于指定视图的名称和区域的名称,Prism 会根据约定自动注册视图。

使用 View Discovery 的好处包括:

  1. 解耦:视图和区域之间的耦合度降低。
  2. 灵活性:您可以轻松地添加或移除视图,而无需修改代码。
  3. 可重用性:视图可以在多个区域中重用。

ViewDiscovery示例

ViewDiscovery示例在https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/04-ViewDiscovery

项目结构如下图所示:

在MainWindow.xaml中定义了一个区域:

在MainWindow.xaml.cs中进行了视图发现:

因此该区域就会显示ViewA,如下所示:

我们可以创建一个ViewB再把区域与ViewB联系起来:

xaml 复制代码
<Grid>
    <TextBlock Text="View B" FontSize="38" />     
</Grid>
csharp 复制代码
 //view discovery
 regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewB));

IRegionManager是什么时候注入容器的?

实现视图发现用到了IRegionManager ,它是一个用于管理区域(Region)的接口。

看到这里,可能大家和我一样,都有个疑问,就是IRegionManager是什么时候注入容器的,为什么这里可以直接使用了呢?会不会是初始化的时候,Prism框架就已经把它注入了呢?我们的猜测是正确的。

查看Prism的源代码,在PrismApplicationBase中看到这个:

这就是在注册Prism框架所需的一些自带服务。查看它的实现:

继续查看:

我们会发现IRegionManager与它的实现类RegionManager是在这里注入容器的,所有我们在主窗体的构造函数中可以直接使用了。

RegisterViewWithRegion方法介绍

RegisterViewWithRegion方法通过注册一个类型来将视图与区域关联起来,当该区域被显示时,这个类型会被ServiceLocator解析成一个具体的实例。这个实例会被添加进区域的视图集合中。

现在只要知道这个方法的含义与用法就行,具体实现先不管,慢慢来从会用开始。

相关推荐
samble2 天前
从零搭建半导体设备上位机(九):拖拽与交互,Adorner、DragDrop 与晶圆拖放信息
wpf·拖拽·adorner
郝学胜-神的一滴3 天前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
波力海苔夹心脆6754 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教4 天前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
光泽雨6 天前
WPF 音视频四大核心方案对比
wpf·音视频
浪扼飞舟7 天前
WPF(数据绑定)
wpf
samble8 天前
从零搭建半导体设备上位机(四):单实例、启动流程与配置文件,App 里那 526 行到底在干什么
wpf·配置文件·单实例
浪扼飞舟8 天前
WPF(控件的继承树、内容控件、布局控件)
wpf
avi911111 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吾与谁归in12 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf