博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从PRISM开始学WPF(八)导航Navigation?
阅读量:6509 次
发布时间:2019-06-24

本文共 3962 字,大约阅读时间需要 13 分钟。

原文:

0x6Navigation

Basic Navigation

Prism中的Navigation提供了一种类似导航的功能,他可以根据用户的输入,来刷新UI。

先看一个最简单的例子,通过按钮来导航到一个视图,在这里,视图被注册为Navication。

public void Initialize()        {            _container.RegisterTypeForNavigation
(); _container.RegisterTypeForNavigation
(); }

Shell 视图中设置两个Button并且绑定下面这个带参数的命令:

public DelegateCommand
NavigateCommand { get; private set; } public MainWindowViewModel(IRegionManager regionManager) { _regionManager = regionManager; NavigateCommand = new DelegateCommand
(Navigate); } private void Navigate(string navigatePath) { if (navigatePath != null) _regionManager.RequestNavigate("ContentRegion", navigatePath); }

RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去。

当需要根据调用结果来处理一些事情,可以使用下面这个方法:

void RequestNavigate(string regionName, string source, Action
navigationCallback);

当然,上面这个方法是在Shell中调用的,但,有些时候,我们需要View或者ViewModel也参与到Navigation中来,比如当你Request一个Navigation的时候,希望navigation本身显示一些信息,为此 Prism为我们提供了一个INavigationAware 接口。

//    // Summary:    //     Provides a way for objects involved in navigation to be notified of navigation    //     activities.    public interface INavigationAware    {        //        // Summary:        //     Called to determine if this instance can handle the navigation request.        //        // Parameters:        //   navigationContext:        //     The navigation context.        //        // Returns:        //     true if this instance accepts the navigation request; otherwise, false.        bool IsNavigationTarget(NavigationContext navigationContext);        //        // Summary:        //     Called when the implementer is being navigated away from.        //        // Parameters:        //   navigationContext:        //     The navigation context.        void OnNavigatedFrom(NavigationContext navigationContext);        //        // Summary:        //     Called when the implementer has been navigated to.        //        // Parameters:        //   navigationContext:        //     The navigation context.        void OnNavigatedTo(NavigationContext navigationContext);    }

如果想要Navigation的目标也参与到Navigation的过程当中,只需要让你的viewmodel实现这个接口,然后在这些方法里编写你的代码就可以了。

IsNavigationTarget方法设置了是否被允许设置为导航的目标,当他的返回值为Fasle的时候,将不会被“导航”到它。

19-NavigationParticipation的例子中,Region的目标是:

TabControl在设置为Region的时候,加载View时会自动创建Page来存放View,如果“导航”到同一个View他会在Page中找到他,并且显示出来。但如果IsNavigationTarget返回False的话,就不会显示之前的Page而是创建了一个新的Page来加载View。

PassingParameters带参数的导航

使用Navigation的时候,将数据源带到新的NavigationTarget中去,然后Target应用这些数据。这将使用到navigation的NavigationContext参数:

private void PersonSelected(Person person)        {            var parameters = new NavigationParameters();            parameters.Add("person", person);            if (person != null)                _regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters);        }

在Target的OnNavigatedTo方法中使用:

public void OnNavigatedTo(NavigationContext navigationContext)        {            var person = navigationContext.Parameters["person"] as Person;            if (person != null)                SelectedPerson = person;        }

当导航变更的时候你需要一些提示框,需要实现IConfirmNavigationRequest

他有一个ConfirmNavigationRequest方法来进行一些判断。

在上面的例子中,我们在view之间跳转的时候,viewA 和viewB是被缓存的,但是有时候,我们跳转到B的时候想要销毁A,怎么来做呢?

在View或ViewModel上实现IRegionMemberLifetime接口,并将KeepAlive属性的值设置为false。

journal

journal 实现一种类似浏览器前进后退按钮一样的效果,当一个region 有多个view的时候,他会自动记录view的加载顺序,然后在view之间来回切换。

Prism中是通过IRegionNavigationJournal来实现的,在视图加载时,讲道理,可以无限级前进和后退的,我自己在官方的例子上加了一个视图也完美运行。

public void OnNavigatedTo(NavigationContext navigationContext)        {            _journal = navigationContext.NavigationService.Journal;        }

然后使用 :

_journal.GoBack();

或者

_journal.GoForward();

转载地址:http://znbfo.baihongyu.com/

你可能感兴趣的文章
排除网络故障课后习题参考答案
查看>>
[LeetCode]Multiply Strings
查看>>
NPOI 2.0导出word(docx格式)
查看>>
有趣的玩意儿
查看>>
DataSet的DataTable高效插入到数据库表
查看>>
Ubuntu文件管理命令系统
查看>>
c#日期类型的使用 (转)
查看>>
引用还是指针?
查看>>
XML与DataSet的相互转换类
查看>>
Python脚本控制的WebDriver 常用操作 <二十八> 超时设置和cookie操作
查看>>
lrzsz linix 远程文件传输工具。
查看>>
[转]ZooKeeper 集群环境搭建 (本机3个节点)
查看>>
去除标题_怎样去除总磷
查看>>
进入工程制图闪退_CAD设计必备:机械制图基础知识
查看>>
和 xcode_在iOS上用Xcode和Create ML检测皮肤癌
查看>>
python二维数组输出下三角_python,将三角函数绘制成二维数组
查看>>
python数据分析与人工智能_Python数据分析:seaborn
查看>>
echarts折线图不显示y轴值_Echarts 折线图y轴标签值太长时显示不全的解决办法
查看>>
改变elementui卡片crad样式_修改ElementUI样式的几种方式
查看>>
齐博php百度编辑器上传图片_为百度UE编辑器上传图片添加水印功能
查看>>