1 根据《prism basic navigation》创建项目和模块

2 在ModuleA中添加ViewAViewModel并让其实现IRegionMemberLifetime接口,此接口包含一个KeepAlive属性,该属性表示当从该VM对应的视图导航到其他视图时候,是否销毁该视图

using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace ModuleA.ViewModels
{public class ViewAViewModel : BindableBase,INavigationAware,IRegionMemberLifetime{public bool KeepAlive => false;public bool IsNavigationTarget(NavigationContext navigationContext){return false;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}}
}

3 在ViewModels文件夹中添加ViewBViewModel类,因为IsNavigationTarget的返回为false,所以每次导航到ViewB时候都要新建一个视图

using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ModuleA.ViewModels
{public class ViewBViewModel : INavigationAware{public bool IsNavigationTarget(NavigationContext navigationContext){return false;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}}
}

4 修改MainWindow界面增加显示视图增加删除的ItemsControl

<Window x:Class="RegionMemberLifetime.Views.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"Title="{Binding Title}" Height="350" Width="525"><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><ItemsControl ItemsSource="{Binding Views}" Margin="5"><ItemsControl.ItemTemplate><DataTemplate><Border Background="LightBlue" Height="50" Width="50" Margin="2"><TextBlock Text="{Binding}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" /></Border></DataTemplate>                </ItemsControl.ItemTemplate></ItemsControl><ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5"  /></DockPanel>
</Window>

5 修改MainWindowViewModel

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Prism.BasicNavigate.ViewModels
{public class MainWindowViewModel:BindableBase{IRegionManager regionManager;private string _title;public string Title{get { return _title; }set { SetProperty(ref _title, value); }}private ObservableCollection<object> _views = new ObservableCollection<object>();public ObservableCollection<object> Views{get { return _views; }set { SetProperty(ref _views, value); }}public DelegateCommand<string> NavigateCommand { get; }public MainWindowViewModel(IRegionManager regionManager){this.regionManager = regionManager;this.regionManager.Regions.CollectionChanged += Regions_CollectionChanged;NavigateCommand = new DelegateCommand<string>(Navigate);}private void Regions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e){if (e.Action == NotifyCollectionChangedAction.Add){var region = (IRegion)e.NewItems[0];region.Views.CollectionChanged += Views_CollectionChanged;}}private void Views_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e){if (e.Action == NotifyCollectionChangedAction.Add){Views.Add(e.NewItems[0].GetType().Name);}else if (e.Action == NotifyCollectionChangedAction.Remove){Views.Remove(e.OldItems[0].GetType().Name);}}private void Navigate(string navigatePath){if (navigatePath!=""){regionManager.RequestNavigate("ContentRegion", navigatePath,NavigateCallBack);}}private void NavigateCallBack(NavigationResult result){Console.WriteLine($"Navigate to {result.Context.Uri} completed");}}
}

prism IRegionMemberLifetime(区域成员生命周期)相关推荐

  1. C++ 作用域与生命周期

    Pascal 之父 Nicklaus Wirth 曾经提出一个公式展示出了程序的本质:程序=算法+数据结构.后人又给出一个公式与之遥相呼应:软件=程序+文档.这两个公式可以简洁明了地为我们展示程序和软 ...

  2. 数据类型,生命周期作用域

    目录 数据类型: 生命周期&作用域: 数据类型: 在C语言中,数据类型一共有char(字符型).short(短整型).int(整型).long(长整型). long long(更长的整型).f ...

  3. vue- Vue-Cli脚手架工具安装 -创建项目-页面开发流程-组件生命周期-03

    目录 本博客环境 Vue-Cli 项目环境搭建 与 python 基础环境对比 环境搭建 创建启动 vue 项目 命令创建项目(步骤小多) 启动 vue 项目(命令行方式) 启动 vue 项目(pyc ...

  4. 【微信小程序-原生开发】实用教程06-轮播图、分类页签 tab 、成员列表(含Tdesign升级,切换调试基础库,设置全局样式,配置组件按需注入,添加图片素材,wx:for,生命周期 onLoad)

    开始前,请先完成首页的开发,详见 [微信小程序-原生开发]实用教程05-首页(含自定义调试模式.插入图片.图文排版.底部留白.添加本地图片) https://blog.csdn.net/weixin_ ...

  5. java成员属性生命周期,Spring注解 - 生命周期、属性赋值、自动装配

    一.Bean的生命周期 流程 Bean创建 -- 初始化 -- 销毁 创建: 单实例:在容器启动时创建对象 多实例:每次调用时创建对象 初始化: 都是在对象创建完成后,调用初始化方法 销毁: 单实例: ...

  6. 【Android 应用开发】UI绘制流程 ( 生命周期机制 | 布局加载机制 | UI 绘制流程 | 布局测量 | 布局摆放 | 组件绘制 | 瀑布流布局案例 )

    文章目录 一. 博客相关资料 及 下载地址 1. 代码查看方法 ( ① 直接获取代码 | ② JAR 包替换 ) 2. 本博客涉及到的源码查看说明 二. Activity 生命周期回调机制 1. An ...

  7. java对象生命周期_Java对象生命周期和类生命周期

    原标题:Java对象生命周期和类生命周期 作者:彭空空 链接:https://www.jianshu.com/p/25ea857ba78b 导读 对象的生命周期 类的加载机制 类的生命周期 类加载器 ...

  8. 多线程——线程的生命周期

    线程状态: 与人有生老病死一样,线程也同样要经历新建.就绪.运行(活动).阻塞和死亡五种不同的状态.这五种状态 都可以通过Thread类中的方法进行控制.创建并运行线程: ① 新建状态(New Thr ...

  9. Java中的垃圾回收与对象生命周期

    转载自   Java中的垃圾回收与对象生命周期 1. 垃圾回收 垃圾回收是Java程序设计中内存管理的核心概念,JVM的内存管理机制被称为垃圾回收机制. 一个对象创建后被放置在JVM的堆内存中,当永远 ...

最新文章

  1. ST-GCN 实现人体姿态行为分类
  2. linux POSIX 信号集,读书笔记:第10章 Posix信号量 (6)
  3. 梅宏院士:软件定义的未来——万物皆可互联,一切均可编程 | CNCC 2017
  4. android阿里聚安全黑盒,阿里安全开放平台-阿里聚安全
  5. CLR查找和加载程序集的方式(二) 流程图
  6. Autosys command
  7. 使用C#实现Windows下无焦点窗体
  8. [转]C# WInForm 无框窗体移动
  9. 泛型型协变逆变_Java泛型类型简介:协变和逆变
  10. 从零学javascript_我刚刚问了23,000个开发人员他们对JavaScript的看法。 这是我学到的。...
  11. Python案例:给出三角形构成方案
  12. iOS开发那些事-iOS6苹果地图有用开发
  13. TOMCAT JNDI RESOUCE
  14. Web渗透测试实战——(2.1)Metasploit 6.0初步
  15. 发现一款牛逼的 IDEA 插件:检测代码漏洞,一键修复!
  16. xshell上传文件到linux很慢,XShell上传文件到Linux服务器上
  17. 22-09-20 西安 谷粒商城(04)Redisson做分布式锁、布隆过滤器、AOP赋能、自定义注解做缓存管理、秒杀测试
  18. 华为云ECS服务器中通过docker部署ELK-kibana
  19. Mac创建txt文件的两种方法
  20. C语言中sort函数的用处

热门文章

  1. Java代码安装maven jar_maven安装本地jar到本地仓库(引入第三方jar, maven打包提示程序包不存在)...
  2. go并发之道学习总结
  3. 中关村2019逆向 Reverse lebel:控制流平坦化 / python字节码分析
  4. STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM
  5. CSS基础:text-overflow:ellipsis溢出文本显示省略号的详细方法_CSS教程
  6. 弦线上的波动方程推导
  7. 阿里巴巴战略投资康佳旗下易平方和KKTV ,加速抢占大屏新赛道...
  8. 多传感器融合定位六-惯性导航原理及误差分析
  9. 陈松松:经验告诉我们,做视频营销这11条标准一条也不能缺
  10. TalkingData首席金融行业专家鲍忠铁:18亿数据解读移动互联网