2013-10-24 55 views
1

我需要在每次頁面加載時重新創建新頁面實例(當用戶按下「後退」按鈕時)。 所以我overrided OnBackKeyPress方法:Windows Phone後退按鈕和頁面實例創建

protected override void OnBackKeyPress(CancelEventArgs e) 
{ 
    base.OnBackKeyPress(e); 
    if (NavigationService.CanGoBack) { 
     e.Cancel = true; 
     var j = NavigationService.RemoveBackEntry(); 
     NavigationService.Navigate(j.Source); 
     NavigationService.RemoveBackEntry(); 
    } 
} 

的問題是,我不能處理的情況下,當用戶按下後退按鈕關閉對話框CustomMessageBox。我如何檢查它?或者有什麼辦法可以強制頁面實例重新回到歷史狀態?

回答

0

爲什麼你需要重新創建頁面實例?如果您只是試圖重新讀取要顯示的數據,爲什麼不將數據加載邏輯放入OnNavigatedTo()?

假設是什麼你真正想實現,嘗試這樣的事情......

public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
     // don't do your data loading here. This will only be called on page creation. 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     LoadData(); 
     base.OnNavigatedTo(e); 
    } 

    MyViewModel model; 

    async void LoadData() 
    { 
     model = new MyViewModel(); 
     await model.LoadDataAsync(); 
    } 
} 

如果你也有,你需要在一個網頁與第一建設運行特定的邏輯返回鍵導航,請檢查傳遞給OnNavigatedTo的NavigationEventArgs對象的NavigationMode屬性。

if(e.NavigationMode == NavigationMode.New) 
{ 
    //do what you need to do specifically for a new page instance 
} 
if (e.NavigationMode == NavigationMode.Back) 
{ 
    // do anything specific for back navigation here. 
} 
+0

是的,我想到了邏輯和理解,我需要分開數據初始化和數據重新加載。我關於重寫'OnBackKeyPress'的決定是快速和糟糕的。現在我在頁面構造函數中初始化所有內容(與「NavigationMode.New」是否相同),然後將它重新啓動到OnNavigatedTo。 – Wayne

0

哈,in the near thread,我有相反的問題:)

有關的MessageBox什麼 - 這取決於您使用的是哪一個。例如,它可以是custom message box。無論如何,請嘗試在OnBackKeyPress()中檢查MessageBox.IsOpened(或MessageBox的替代選項)。

另一種解決方案是使用每次想要成爲新頁面的OnNavigatedTo()。

解決方案三:在你的作品與MVVM光的情況下,加入一些獨特的ID在視圖模型吸氣,像

public MyViewModel MyViewModel 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MyViewModel>((++Uid).ToString()); 
     } 
    } 

這將迫使每一次重新創建新的視圖模型,所以你必須VM的不同實例,所以你會在視圖上有另一個數據。