工做中以前接触过的WPF程序一直是使用TabControl做不一样页面间的切换,每一个Tab负责独立的功能,清晰简捷,因此一直就没有动力研究WPF自带的页面导航。(虽然接触过使用页面导航的WPF项目,也并无去了解,而是似懂非懂地过去了。)web
直到最近作的一个项目,用的仍是TabControl,但在某个Tab里面,作的任务有些复杂,致使UI在操做先后会有很大的变化。很天然的想法就是在这个Tab中使用两个view(我并无指明是UserControl仍是Page),来回切换。然而粗略地调查了一下以后以为实现起来有点麻烦,而后这个Tab也不是特别复杂,因而就硬着头皮使用了笨方法:把全部控件都画上去,后台的ViewModel用各类属性绑定控制各个控件的隐藏、显示、以及位置。编程
实现的效果很好,但终究是有些不踏实。因而最近趁着项目间歇,花时间看了一下WPF的页面导航,如下是学习总结。app
1. WPF自带的页面导航mvvm
网上搜到了一篇WPF Navigation的博客,讲解地很到位。《WPF编程宝典》2010版的第24章内容差很少,也讲的很全面。wordpress
WPF的页面导航实际上是微软在发明了Inductive User Interface 后引入的。听说用户每每以为web应用要比桌面应用更好用,所以桌面应用着急了,就开始学web应用了。学习
WPF页面导航的几个关键组件:负责导航的NavigationService,能够导航的用户界面Page,以及最经常使用的导航容器Frame。在上文博客中还介绍了页面的生命周期,颇有意思。还有更高级的PageFunction等等,很好很强大。再回头看看之前的那个使用导航的项目,以为看懂了好多~blog
2. 不使用页面导航来实现页面跳转生命周期
然而有人表示不服。她是这样说的:“我一开始也被如何搞定页面导航弄糊涂了。不过,我坚信应该让ViewModel去作一切的工做,而View只是个漂亮的界面而已。我不想在界面上弄个按钮而后带段代码来切换页面。”get
她想到了一个很漂亮的方案来实现页面跳转。分别在下面两个博客里。博客
第一篇博客说,你只须要在你的ViewModel里面加一个Property,叫CurrentView,而后根据状况为这个属性赋上不一样的ViewModel。在主界面里,用一个ContentControl来绑定CurrentView。至于如何渲染界面,则采用DataTemplate!妙哉!
第二篇博客则补充了如何在application中加入一个ApplicationViewModel,来管理不一样的ViewModel的切换。
最后她还推荐去看一下WPF的消息系统,如MVVM Light’s Messenger, 或 Microsoft Prism’s EventAggregator (to broadcast ChangePage commands from any ViewModel so you wouldn’t need to find the ApplicationViewModel to execute the ChangePageCommand, however that’s for another day)
是啊,that's for another day... 改天吧~