WPF Prism导航操作,导航传参,导航拦截,导航日志笔记

导航传参

引入using Prism.Regions;命名控件

 /// <summary>
        /// 打开导航并传参
        /// </summary>
        /// <param name="obj">要打开的导航模块名</param>
        private void Open(string obj)
        {
            //定义传参变量
            NavigationParameters keys = new NavigationParameters();
            
            //添加参数,键值对格式
            keys.Add("Title", "Hello!");
            //打开指定导航赋值给名字为“ning”的控件,不传参数
            //regionManager.Regions["ning"].RequestNavigate(obj);
            //打开指定导航赋值给名字为“ning”的控件,并把参数传过去
            regionManager.Regions["ning"].RequestNavigate(obj,keys);
             //Callback回调函数
            regionManager.Regions["ning"].RequestNavigate(obj, Callback =>
            {

            },keys);
            //第一个参数是目标域名称,第二参数calendarViewUri是一个Uri类型的对象,该对象名称是需要导向View的名称。keys是参数
            //regionManager.RequestNavigate("ContentRegion", "HelloView", keys);
        }

接收参数,导航拦截,是否每次打开重新创建实列

类继承IConfirmNavigationRequest
继承实现OnNavigatedTo方法

navigationContext.Parameters.GetValue(“参数键名”);
可以接收参数

 //接收导航传过来的参数
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            //判断是否有这个Key
            if(navigationContext.Parameters.ContainsKey("Title"))
            {
                //取出传过来的值
                title = navigationContext.Parameters.GetValue<string>("Title");
            }
        }

继承实现ConfirmNavigationRequest方法,这方法就是用于导航拦截

 //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            bool result = true;
            if (MessageBox.Show("确认导航", "温馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
                result = false;
            continuationCallback(result);
        }

继承实现IsNavigationTarget方法,该方法决定第二次打开是否重新创建,重新new 该实列

//每次导航的时候,改实列用不用重新创建,true是不重新创建,false是重新创建
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }

完整代码

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,IConfirmNavigationRequest 
    {
        private string title { get; set; }
        public string Title{ 
            get
            {
                return title;
            }
            set
            {
                value = title;
                RaisePropertyChanged();
            }
        }
        public ViewAViewModel()
        {

        }
        //每次导航的时候,改实列用不用重新创建,true是不重新创建,false是重新创建
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }
        //这个方法用于拦截请求
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
           
        }
        //接收导航传过来的参数
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            //判断是否有这个Key
            if(navigationContext.Parameters.ContainsKey("Title"))
            {
                //取出传过来的值
                title = navigationContext.Parameters.GetValue<string>("Title");
            }
        }
        //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            bool result = true;
            if (MessageBox.Show("确认导航", "温馨提示", MessageBoxButton.YesNo) == MessageBoxResult.No)
                result = false;
            continuationCallback(result);
        }
    }
}

导航日志,返回上一步操作

声明日志变量,用于记录,返回上一次或下一次操作

  private IRegionNavigationJournal journal;

在导航回调函数记录操作到日志

 regionManager.Regions["ning"].RequestNavigate(obj, callback =>
            {
                //判断回调函数是否返回成功true
                if (callback.Result != null&&(bool)callback.Result)
                {
                    //记录操作日志
                    journal=callback.Context.NavigationService.Journal;
                }
            },keys);

返回上一步或者下一步操作

 public void Back()
        {
            //返回上一步,if先判断是否能返回上一步
            if(journal.CanGoBack)
                journal.GoBack();
            //返回下一步,if先判断是否能返回下一步
            //if (journal.CanGoForward)
            //    journal.GoForward();
        } 

导航日志所有代码

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prism模块化Dome.ViewModels
{
    public class MainViewModel: BindableBase
    {
        private readonly IRegionManager regionManager;
        public DelegateCommand<string> OpenCommand { get; private set; }
        //声明日志变量
        private IRegionNavigationJournal journal;
        public DelegateCommand BackCommand { get; private set; }
        public MainViewModel(IRegionManager regionManager)
        {
            OpenCommand = new DelegateCommand<string>(Open);
            BackCommand = new DelegateCommand(Back);
            this.regionManager = regionManager;
        }
        public void Back()
        {
            //返回上一步,if先判断是否能返回上一步
            if(journal.CanGoBack)
                journal.GoBack();
            //返回下一步,if先判断是否能返回下一步
            //if (journal.CanGoForward)
            //    journal.GoForward();
        } 
        /// <summary>
        /// 打开导航并传参
        /// </summary>
        /// <param name="obj">要打开的导航模块名</param>
        private void Open(string obj)
        {
            //定义传参变量
            NavigationParameters keys = new NavigationParameters();
            
            //添加参数,键值对格式
            keys.Add("Title", "Hello!");
            //打开指定导航赋值给名字为“ning”的控件,不传参数
            //regionManager.Regions["ning"].RequestNavigate(obj);
            //打开指定导航赋值给名字为“ning”的控件,并把参数传过去
            //regionManager.Regions["ning"].RequestNavigate(obj,keys);
            //Callback回调函数
            regionManager.Regions["ning"].RequestNavigate(obj, callback =>
            {
                //判断回调函数是否返回成功true
                if (callback.Result != null&&(bool)callback.Result)
                {
                    //记录操作日志
                    journal=callback.Context.NavigationService.Journal;
                }
            },keys);
            //第一个参数是目标域名称,第二参数calendarViewUri是一个Uri类型的对象,该对象名称是需要导向View的名称。keys是参数
            //regionManager.RequestNavigate("ContentRegion", "HelloView", keys);
        }
    }
}

<think>好的,用户想了解C# Prism框架中导航的实现方案。首先,我需要回忆Prism的核心概念,尤其是导航相关的部分。Prism使用RegionManager来管理UI区域,允许动态加载不同模块的视图。记得用户提供的引用中提到了ContentControl和RegionName,这说明在XAML中定义区域是关键步骤。 接下来,我需要整理导航的实现步骤。首先创建区域,引用中的XAML代码示例使用了prism:RegionManager.RegionName属性,这应该是注册区域的方法。然后,导航需要通过IRegionManager接口来请求导航到指定视图。ViewModel中注入IRegionManager,然后调用RequestNavigate方法,传递区域名称和视图名称。 还要考虑导航日志Prism默认会记录导航历史,但用户可能需要禁用,这可以通过KeepRegionActive属性设置。另外,导航事件的处理也很重要,比如INavigationAware接口,可以在导航前后执行逻辑,比如权限检查或数据加载。 需要确保提到的部分都有对应的引用支持,比如引用[2]和[3]中的XAML代码示例,引用[4]提到的在ViewModel中使用导航。同时,要注意用户可能关心的点,比如参数传递、导航确认等,但根据引用内容,这些可能不在当前范围内,所以暂时不深入。 最后,生成的相关问题要围绕导航的实现细节、优化和应用场景,确保覆盖用户可能进一步询问的方向。比如如何传参、处理导航事件、区域管理机制等。检查所有LaTeX格式是否正确,确保没有使用任何Markdown,保持回答结构清晰,分步骤说明。</think>在C#Prism框架中,导航功能通过区域(Region)管理和依赖注入实现,具体方案如下: ### 一、核心实现步骤 1. **区域注册** 在XAML中通过`prism:RegionManager.RegionName`定义可动态加载内容的容器区域,例如: ```xml <ContentControl prism:RegionManager.RegionName="ContentRegion"/> <!--引用[2][3]--> ``` 2. **视图与区域绑定** 在模块初始化时,通过`IRegionManager`将视图注册到区域: ```csharp public class Module : IModule { private readonly IRegionManager _regionManager; public Module(IRegionManager regionManager) => _regionManager = regionManager; public void OnInitialized() { _regionManager.RegisterViewWithRegion("ContentRegion", typeof(HomeView)); } } ``` 3. **导航触发** 在ViewModel中通过注入的`IRegionManager`发起导航请求: ```csharp public class MainWindowViewModel { private readonly IRegionManager _regionManager; public DelegateCommand NavigateCommand { get; } public MainWindowViewModel(IRegionManager regionManager) { _regionManager = regionManager; NavigateCommand = new DelegateCommand(() => _regionManager.RequestNavigate("ContentRegion", "UserView")); <!--引用[4]--> } } ``` ### 二、关键技术特性 1. **导航日志** Prism默认记录导航历史栈,可通过`Journal`属性实现前进/后退: ```csharp _regionManager.Regions["ContentRegion"].NavigationService.Journal.GoBack(); ``` 2. **导航拦截** 实现`IConfirmNavigationRequest`接口可控制导航流程: ```csharp public class UserViewViewModel : IConfirmNavigationRequest { public void ConfirmNavigationRequest(NavigationContext context, Action<bool> continuationCallback) { if (HasUnsavedChanges) ShowConfirmationDialog(continuationCallback); else continuationCallback(true); } } ``` 3. **参数传递** 通过`NavigationParameters`传递数据: ```csharp var parameters = new NavigationParameters { { "userId", "123" } }; _regionManager.RequestNavigate("ContentRegion", "UserView", parameters); ``` ### 三、最佳实践建议 1. **区域生命周期** 使用`RegionMemberLifetime`属性控制视图实例存活时间: ```csharp [RegionMemberLifetime(KeepAlive = false)] public partial class TempView : UserControl ``` 2. **导航事件订阅** 通过`INavigationAware`接口响应导航事件: ```csharp public class DetailViewModel : INavigationAware { public void OnNavigatedTo(NavigationContext context) => LoadData(); public void OnNavigatedFrom(NavigationContext context) => SaveState(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值