首页 > 其他分享 >Prism进入视图时导航的三种方式

Prism进入视图时导航的三种方式

时间:2023-06-21 14:00:30浏览次数:36  
标签:regionManager Region ViewModel ContentRegion 视图 Prism RegionManager 导航

Prism导航

  1. 新建视图UserControl及其ViewModel,被跳转的视图的VM需要实现INavigationAware

  2. App.xaml.cs中注册视图及其ViewModel

// App.xaml.cs
containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
  1. 在需要放置导航内容处声明ContentControlregion占位:
    <DockPanel LastChildFill="True">
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" >
            <Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button>
            <Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button>
        </StackPanel>
        <ContentControl prism:RegionManager.RegionName
            ="{x:Static ext:PrismManager.MainViewRegionName}" />
    </DockPanel>
  • RegionPrism内部的一个数据结构,它的Name属性是此处在XAML中声明的RegionName(详见下节)。
  1. 在需要进行导航行为的ViewModel处注入并使用,如:
// ViewModel
        public DelegateCommand<string> NavigateCommand { get; private set; }

        public MainWindowViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

            NavigateCommand = new DelegateCommand<string>(Navigate);
        }

        private void Navigate(string navigatePath)
        {
            if (navigatePath != null)
                _regionManager.RequestNavigate("ContentRegion", navigatePath);
        }

RegionManager

image

  • Region 对应的是在XAML中声明的 ContentControl 的附加属性 prism:RegionManager.RegionName

  • RegionManager 管理着所有 Region 对象,这些 Region 对象被装到 RegionCollection 中的列表属性

  • RegionManager中的3个方法

    • UpdateRegionsPrismApplicationBase#Initialize 中被调用,它会根据在XAML中声明的RegionName 创建 Region 对象
    • RequestNavigate 在需要导航时调用,调用它时会根据 regionName 去 regionCollection 中找到对应的 Region 对象,并通过集合 ActiveViews 找到满足条件的 View 实例从而进行 ContentControl内容的切换
    • 可以主动调用 RegisterViewWithRegion 进行 Region 和视图的注册

在进入视图时导航

由于 View 和 ViewModel 的初始化 MvvmHelpers.AutowireViewModel(shell); 先于 Region 的初始化RegionManager.UpdateRegions();,因此在View和ViewModel初始化时找不到相应的 Region 对象。

// PrismApplicationBase.cs
protected virtual void Initialize()
{
    // ...
    if (shell != null)
    {
        MvvmHelpers.AutowireViewModel(shell);
        RegionManager.SetRegionManager(shell, _containerExtension.Resolve<IRegionManager>());
        RegionManager.UpdateRegions();
        InitializeShell(shell);
    }
    // ...

在窗口初始化时,Initilized 事件发生时数据绑定未完成;Loaded 事件发生时数据绑定已经完成。

因此,可以手动注册 Region;也可以在数据绑定结束之后访问 Region

方法1 Loaded事件

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    regionManager.RequestNavigate("ContentRegion", "ViewA");
}

方法2 手动注册 Region

// App.xaml.cs
protected override void Initialize()
{
    base.Initialize();

    var regionManager = Container.Resolve<IRegionManager>();
    regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
}

// ViewModel
public MainWindowViewModel(IRegionManager regionManager)
{
    regionManager.RequestNavigate("ContentRegion", "ViewA");
}

方法3 Dispatcher

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
    regionManager.RequestNavigate("ContentRegion", "ViewA");
}));

引用

  1. Prism - Region navigation
  2. learn.microsoft - Object lifetime events (WPF .NET)

标签:regionManager,Region,ViewModel,ContentRegion,视图,Prism,RegionManager,导航
From: https://www.cnblogs.com/bblitz/p/17495688.html

相关文章

  • iOS开发系列课程(07) --- 分栏视图控制器
    UITabBarController的使用  UITabBarController是如下所示的视图控制器,有人叫它分栏视图控制器,也有人叫它选项卡控制器或页签视图控制器(通常我不称它为标签视图控制器主要是为了避免和UILabel标签混淆),它是在很多App种都能见到的一种视图控制器,如下图所示。  使用UITabBarContro......
  • iOS开发系列课程(05) --- 导航视图控制器
    简介  导航视图控制器是一个特殊的容器视图控制器,它可以维护有明确层次关系的视图之间的切换。我们可以打开模拟器或者你的iPhone看看设置功能,这里就是一个典型的对导航视图控制器的应用,如下图所示。很明显,导航视图控制器维护了一个栈结构,这是一种先进后出(FILO)的结构,我们将一个一......
  • iOS开发系列课程(09) --- 滚动视图
    UIScrollView入门  移动设备的屏幕⼤小是极其有限的,因此直接展⽰在⽤户眼前的内容也相当有限,当展⽰的内容较多超出一个屏幕时,用户可通过滚动操作来查看屏幕以外的内容,普通的UIView不具备滚动功能,不能显⽰过多的内容。UIScrollView是一个能够滚动的视图控件,可以⽤用来展⽰大量的......
  • 6. SpringMVC的视图
    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户SpringMVC视图的种类很多,默认有转发视图和重定向视图当工程引入jstl的依赖,转发视图会自动转换为JstlView若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图......
  • 好用网址分享-77ai导航与77搜索导航
    AI(人工智能)技术正在改变我们的生活方式和工作方式,越来越多的人开始关注和使用AI相关的网站和应用程序。在这篇文章中,我将为大家介绍一些常用的AI网址导航,帮助您更好地了解和使用AI技术。AIHubAIHub是由GoogleCloud推出的一个开放平台,旨在帮助企业和开发者快速构建、部署和管......
  • .Net Core Mvc 2. VS2022 + Core6.0 + Mvc 添加视图,传递数据
    添加视图找到控制器HelloWorldController的叫Index的Action在上面右键,选择添加视图,选择空,确认后会在Views文件夹下新建一个HelloWorld文件夹,并生成Index.cshtml文件。直接运行 可以看到Index视图有默认的头部内容和底部内容(太长了没截取),这个效果是在Views\Shared文件夹下的_......
  • 视图的使用及sql语句阅读
    视图的使用及sql语句阅读1、视图1.1概念 视图是由数据库中的一个表或多个表导出的虚拟表,其作用是方便用户对数据的操作。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。1.2常见应用重用SQL语句简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询......
  • Android 12 自定义底部导航栏
    1.修改配置文件 frameworks\base\packages\SystemUI\res\values\config.xml<!--Navbarbuttondefaultordering/layout--><stringname="config_navBarLayout"translatable="false">left[.5W];leftrotate,volume_sub,back,home,r......
  • odoo16里面修改tree视图样式
    一、在static文件夹下新建一个css文件夹并将*.css文件写入/*该文件用来定义视图中的一些格式,需要用到的地方直接在xml文件中进行引用*//*语法说明*//*tableth:nth-child(1)代表定位到table的th上面到第一个th标题nth-child()参考css语法http://www.w3school.com.cn/c......
  • ORACLE如何找出视图依赖的对象和视图嵌套层数
    之前写过一篇文章“SQLServer如何找出视图依赖的对象和视图嵌套层数”,这里我介绍一下Oracle数据库中如何找出视图的依赖对象以及视图嵌套层数关系。主要通过DBA_DEPENDENCIES这个系统视图(这个系统视图中包含有对象的依赖关系数据)。另外,我们使用了Oracle的树形查询(层级查询)来展示这......