2010-11-04 103 views
5

我在Silverlight中構建了一個wp7應用程序。我所有的應用程序狀態都存儲在NavigationContext.QueryString中。如果這可以在應用程序停用時保存,並且該頁面導航到應用程序重新激活時,這將照顧我對墓碑的要求。Windows Phone 7:與URIs墓碑?

不過,我不太清楚如何做到這一點。我正在考慮將NavigationContext.QueryString保存到State字典App.xaml.cs::Application_Deactivated(),但該代碼無權訪問NavigationContext.QueryString。有另一種方法可以做到這一點嗎?

我想我可以只查詢字符串每次我瀏覽時保存到State字典,然後還原應用程序時,被重新激活。還是有更好的方法?

更新:基於indyfromoz的回答,我想實現以下

OnNavigatedToHandler() 
{ 
    // save NavigationContext.QueryString in the State dictionary 
} 

以減少冗餘,我想我會在從PhoneApplicationPage繼承的類實現此,然後讓我的所有其他頁面繼承該類。但是,然後我得到所有頁面類別爲partial的問題,因爲它們也是在生成的代碼中定義的。我不想更改生成的代碼,因爲每次重新生成代碼時都會產生巨大的痛苦。

有沒有更好的方法來做到這一點?

更新2:這裏是我現在黑客一起在我的應用程序(也就是導航到啓動時的一個)的主頁:

public partial class MainPivot : PhoneApplicationPage 
{ 
    public MainPivot() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainPivot_Loaded); 
     PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(App_Deactivated); 

     MessageBox.Show("launching main pivot (state count: " + PhoneApplicationService.Current.State.Count + ")"); 
     if (PhoneApplicationService.Current.State.Count != 0) 
     { 
      Debug.Assert(PhoneApplicationService.Current.State.ContainsKey(QueryStringKey), 
       "State is initialized, but contains no value for the query string"); 

      string oldQueryString = (string)PhoneApplicationService.Current.State[QueryStringKey]; 
      MessageBox.Show("Old query string: " + oldQueryString); 
      NavigationService.Navigate(new Uri(oldQueryString)); 
     } 
    } 

    public readonly string QueryStringKey = "queryString"; 

    void App_Deactivated(object sender, DeactivatedEventArgs e) 
    { 
     PhoneApplicationService.Current.State[QueryStringKey] = NavigationService.Source; 
    } 

    // ... 

它的工作原理(八九不離十),但它的醜陋。

更新3:看起來像wp7操作系統將自動重新加載頁面應用程序中的正確頁面。實際上我使用的是頁面,所以在這裏可能沒有太多工作要做。

但是,它似乎並不奏效。我啓動應用程序,進入一個頁面,點擊「開始」,然後點擊「返回」。屏幕上顯示「恢復...」,但似乎掛在那裏。我的代碼是否應該以某種方式迴應?即使在點擊「開始」之後,是否可以保持調試器的連接?

回答

5

瞬態數據通常被存儲在State dictionary provided by the PhoneApplicationService class。數據存儲在頁面的OnNavigatedFrom事件中,並從頁面的OnNavigatedTo事件中恢復。如果存儲在OnNavigatedFrom事件是在應用程序中的每一頁可用內的狀態字典從頁面的URI參數,就可以實現邏輯中的OnNavigatedTo事件讀取參數,從而採取墓碑

的護理

HTH,indyfromoz

+0

權。對於每個頁面,我希望'OnNavigatedFrom'方法相同 - 將當前URI保存到'State'中。我想通過繼承來做到這一點,但看起來我不能,基於生成的代碼。有另一種方法可以做到嗎? – 2010-11-12 04:55:11

+0

你在應用程序中使用MVVM嗎?我使用了MVVMLight工具包,並使用帶有OnNavigatedFrom/OnNavigatedTo消息過濾器的Messenger類來有效地存儲應用程序中的數據。 – indyfromoz 2010-11-12 07:32:30

+0

我沒有在我的應用程序中明確使用MVVM。 MV Phone是否可用於Windows Phone 7? – 2010-11-12 14:44:57