工做中以前接觸過的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... 改天吧~