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

这篇具有很好参考价值的文章主要介绍了Prism进入视图时导航的三种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

  • 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文章来源地址https://www.toymoban.com/news/detail-493584.html

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

引用

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

到了这里,关于Prism进入视图时导航的三种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线程创建的三种方式

    目录 1. Thread类 2. Runnable接口 3. Callable接口 4. 线程的生命周期 新建  就绪 运行 阻塞 等待 结束 继承Thread类的方式创建线程 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务 创建Thread类的子类,即创建了线程对象 调用线程对象的

    2024年02月09日
    浏览(42)
  • Servlet的三种映射方式

    Servlet支持三种映射方式,以达到灵活配置的目的。 首先先创建Servlet(创建方式略),然后再web.xml中就行配置。 配置方式:         (1)、 指名道姓的方式         注:此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。 示例:         (

    2024年02月06日
    浏览(44)
  • 解决NPE的三种方式

    NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑: 明确处理空引用情况: 在某些情况下,无法避免使用可能为空的引用对象。此时,需要明确处理空引用情况,以避免抛出NPE。可以使用条件判断,例如使用if-else语句或者三

    2024年02月22日
    浏览(52)
  • 集合的三种遍历方式

    目录 文章目录 一.迭代器遍历 二.增强for遍历 三. forEach方法 四. Lambda表达式  函数式接口: 函数式接口是指只有一个抽象方法的接口 为什么Lambda只能用于函数式接口 总结 前言 作者简介:最爱吃兽奶 座右铭:抱怨身处黑暗,不如提灯前行 内容介绍:今天给大家讲一下集合的遍历方

    2024年02月06日
    浏览(43)
  • selenium的三种等待方式

    设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点:不智能,使用太多的sleep会影响脚本运行速度。 使用方法:time.sleep(delay) 使用举例:打开百度,强制等待5秒 (无条件等待,在一个时间段内等待) 一次设置,全局生效。 不要当作固定等待

    2023年04月13日
    浏览(47)
  • redis的三种集群方式

    redis有三种集群方式:主从复制,哨兵模式和集群。     1.主从复制   主从复制原理:   从服务器连接主服务器,发送SYNC命令;  主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;  主服务器BGSAVE执行完后,向所有从服务器

    2024年02月13日
    浏览(48)
  • 单点登录的三种方式

    因为一个项目种有多个服务组成,每个服务都是独立的,如果登录的时候在一个服务种,那么其他的服务是显示不了的,所以就有了单点登录。 所谓单点登录就是一处登录,处处登录。 第一种方式:session广播机制实现 第一种当时的的原理是session的复制,就是在多个服务中

    2024年02月15日
    浏览(49)
  • JavaScript的三种引用方式

    1.1、标签引用(或嵌入式) 使用 script 标签将 JavaScript 代码嵌入到 HTML 页面中。可以放置在 head 或 body 中。 显示效果: 1.2、 文件引用 (外链式) 将 JavaScript 代码编写在一个独立的 .js 文件中,并通过 script 标签的 src 属性引入到 HTML 页面中。 显示效果: 1.3、行内式 直接在

    2024年02月02日
    浏览(46)
  • 网络通信的三种方式

    通常指网络代理的一种工作模式,即将所有网络连接都通过代理服务器进行转发,而不管这些连接是否需要被代理。在全局模式下,所有的流量都会被代理服务器拦截和转发,因此可以实现对所有网络请求的监控和管理。全局模式通常用于需要访问受限资源或者需要对所有网

    2024年02月09日
    浏览(56)
  • 路由协议的三种分类方式

    路由协议概念 路由器提供了异构网互联的机制,实现将一个网络的数据包发送到另一个网络。而路由就是指导IP数据包发送的路径信息。路由协议就是在路由指导IP数据包发送过程中事先约定好的规定和标准。 路由协议分类 一、按照获取方式分类 链路层发现: 直连路由 静态

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包