2012-10-05

[Windows Phone 7] Mango 密記–關於 OnNavigatedTo 跟 Constructor 一些不同..

 

一個朋友問我一個問題,他問我說為什麼有的網路上面範例..

會把初始化的東西有的寫在Ctor ,但是有的寫在 OnNavigatedTo

這是為什麼呢?!

其實這邊有詳細的答案 : http://create.msdn.com/en-US/education/quickstarts/Running_your_App_in_the_Background_(Tombstoning)

但是我依然做一個小範例就可以馬上懂這用途..

首先 在程式端是這樣寫的…

public TestPage()
{
MessageBox.Show("Ctor");
InitializeComponent();

}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
MessageBox.Show("OnNavigatedTo");
base.OnNavigatedFrom(e);

}

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
MessageBox.Show("OnNavigatedFrom");
base.OnNavigatedFrom(e);

}

在程式跑起Ctor的時候我讓它 跳出 "Ctor" 如果 OnNavigatedTo 被觸發時候就會跳出 "OnNavigatedTo"


所以當程式一開始被執行的時候


會先是出現..


sshot-98_2


之後出現..


sshot-99_2


不就先後順序不同… 那差在哪裡呢?!


重點就在於如果你按下搜尋紐,或是把螢幕鎖起來,之後再打開。


程式就只會跑..


sshot-99_4


所以為什麼很多範例,反而會把很多初始化的東西 寫在 OnNavigatedTo 而並非寫在Ctor ..


尤其像是相機範例…等…他必須要在即使你會來後相機狀態還是打開的…


因為遇到很多時候,看起來似乎一切正常,但是程式被中斷回來後,卻都不太正常的原因..


還有墓碑機制(tombstoning )真的一定要弄清楚…不然真的用多了Page Navigation 在交錯的交叉組合下..


程式一大就會開始物件錯亂..Binding Null …


這觀念很簡單,但是之前被這東西搞到…Orz..