1、使用nuget添加起始工程 app
2、修改App.xaml文件和App.xaml.cs文件 框架
AppBootstrapper介紹: 函數
AppBootstrapper根據中文的直譯能夠看出來此類的大概的做用,但筆者總結爲: ui
一、負責接管程序生命週期中的事件(Lunch Deactivate等) spa
二、配置IOC容器 code
三、添加自定義的命名協定 blog
一、負責接管程序生命週期中的事件: 接口
以前的app生命週期相關的操做在AppBootstrapper裏面能夠經過重載找到,所以若程序原來邏輯中存在處理,放到對應的函數中便可 生命週期
二、配置IOC容器: 事件
CM框架中自帶了一個容器,叫作PhoneContainer,很簡潔的容器,提供了一系列的函數用來配置,若是但願使用其餘容器,那麼能夠在AppBootstrapper中進行修改和配置 Container介紹
三、添加自定義命名協定:
CM有一套自動binding機制,能夠根據控件的Name對應到VM中的屬性上,並將控件設定的屬性Binding到VM中對應的屬性上。舉個例子:
對於TextBox而言x:Name若設定爲Title,那麼便會自動將Textbox的Text屬性自動Binding到TextBox的DataContext所在的VM的Title屬性上(若是存在)
固然若是不喜歡這種方式,使用原始的Binding也是支持的。(筆者建議使用Text={Binding Title}更具可讀性)
3、CM的View和ViewModel自動Binding機制
CM會根據內置的View、ViewModel 命名協定(Conventions)尋找View/ViewModel
具體的協定內容以下:
|
ViewModel |
View |
Convention |
<EntityName>ViewModel |
<EntityName>View |
舉例 |
TabViewModel |
TabView |
Convention |
<EntityName>PageViewModel |
<EntityName>Page |
舉例 |
OrderPageViewModel |
OrderPage |
Convention |
<RootNS>.<ViewModelTypeName> |
<RootNS>.<ViewTypeName> |
舉例 |
MyProject.MainPageViewModel |
MyProject.MainPage |
Convention |
<RootNS>.ViewModels.[<ChildNS>].<ViewModelTypeName> |
<RootNS>.Views.[<ChildNS>].<ViewTypeName> |
舉例 |
MyProject.ViewModels.ShellViewModel |
MyProject.Views.ShellView |
|
MyProject.ViewModels.Utilities.SettingsViewModel |
MyProject.Views.Utilities.SettingsView |
4、CM的頁面導航處理
UriBuilder
工做原理:
此類爲一個Builder類用來構建導航的Uri。並根據View-ViewModel協定,根據ViewModel找到對應的View路徑,而後進行導航。
主要方法:
WithParam |
將傳入的參數和值寫入到類內部的字典中 |
Navigate |
調用內部BuildUri方法,將以前字典中的鍵值對序列化成導航參數,根據ViewModel找到View路徑,而後調用INavigationService接口定義的導航方法 |
FrameAdapter
CM內部實現了FrameAdapter這個類這個類的核心功能爲:
一、Hook 程序的Frame的導航事件,Navigating,Navigated
二、在Navigating觸發的時候
判斷上一個頁面的DataContext是否實現了IGuardClose和IDeactivate接口,若實現了IGuardClose接口,則根據接口中定義的CanClose來決定是否取消此次導航。若實現了IDeactive接口,則調用觸發上一個頁面的DataContext的Deactivate方法,具體代碼在後面。
三、在Navigated觸發的時候
經過反射調用頁面的構造方法(所以xaml.cs文件甚至能夠刪除掉) |
根據當前頁面,根據View-ViewModel協定找到對應的ViewModel,將當前頁面的DataContext設置爲對應的ViewModel。 |
根據導航串中參數將參數注入到ViewModel中對應的屬性上 |
根據命名協定對頁面的子元素分別進行Binding |
若ViewModel實現了IActivite接口,同時調用Activate |
以上介紹能夠到CM的主頁上找到源碼進行更進一步的查看,並加深理解
明白上述兩個類的職責以後,那麼當咱們使用CM框架進行導航的時候,就能夠清楚的瞭解CM是如何實現根據VM找到View而後導航,而且將對應的屬性賦值上去了。
若是對CM框架有任何問題歡迎加入
WP8交流羣:182659848