2010-11-04 26 views
5

Silverlight'ta bir wp7 uygulaması yapıyorum. Uygulamamın tüm durumu NavigationContext.QueryString'da saklanır. Bu uygulamanın devre dışı bırakılması üzerine kaydedilebilirse ve bu sayfa uygulama yeniden etkinleştirmeye yönlendirilirse, bu, taşlama gereksinimlerimi dikkate alırdı. Ancak, bunun nasıl yapılacağını tam olarak bilmiyorum. NavigationContext.QueryString dosyasını App.xaml.cs::Application_Deactivated() numaralı sözlükte kaydetmeyi düşünüyordum, ancak bu kod NavigationContext.QueryString erişim hakkına sahip değil. Bunu yapmanın başka bir yolu var mı?Windows Phone 7: URI'lerle Tombstone?

Her gittiğimde sorgu dizesini her zaman State sözlüğüne kaydedebilirim, ardından uygulama yeniden etkinleştirildiğinde bunu geri yükleyebilirim. Ya da daha iyi bir yaklaşım var mı?

Güncelleme: 'ın indyfromoz cevap dayanarak, ben PhoneApplicationPage devralan bir sınıfta bu uygulamaya düşündüm aşağıdaki

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

fazlalığını azaltmak için uygulamak istiyorum sonra sayfaların geri kalanı bu sınıftan miras kalıyor. Ancak, sonra tüm sayfa sınıfları partial olduğu için sorun, çünkü bunlar da oluşturulan kodda tanımlanmıştır. Oluşturulan kodu değiştirmek istemiyorum, çünkü her yeniden yaratıldığında yeniden canlanması büyük bir acı olacaktır.

Bunu yapmanın daha iyi bir yolu var mı?

Güncelleme 2: (sorta) Çalışıyor

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; 
    } 

    // ... 

ama çirkin: İşte benim app (başlangıçta için navigasyon olduğunu one) ana sayfasında şimdi birlikte hack am budur .

Güncelleştirme 3: Wp7'nin sayfa tabanlı bir uygulamada doğru sayfayı otomatik olarak yeniden yükleyeceği anlaşılıyor. Aslında sayfaları kullanıyorum, belki de burada yapmam gereken çok fazla iş yok. Bununla birlikte, çalışıyor gibi görünmüyor. Uygulamayı başlatıyorum, bir sayfaya gidin, "Başlat" a basın, sonra "Geri" ye basın. Ekranda "Devam ediyor ..." yazıyor ama orada asılı duruyor. Kodumun bu noktada bir şekilde yanıt vermesi gerekiyor mu? "Başlat" a basıldıktan sonra bile hata ayıklayıcısını ekleyebileceğim bir yol var mı?

cevap

5

Geçici veriler genellikle State dictionary provided by the PhoneApplicationService class'da depolanır. Veriler, sayfanın OnNavigatedFrom olayında saklanır ve sayfanın OnNavigatedTo olayından geri yüklenir. Uygulamanızın her sayfasında kullanılabilen OnNavigatedFrom olayındaki durum sözlüğündeki sayfanın URI'sindeki parametreleri kaydederseniz, OnNavigatedTo olayındaki parametreleri okumak için mantığı uygulayabilirsiniz, böylece Tombstoning

HTH, indyfromoz

+0

Sağ. Her sayfa için, "OnNavigatedFrom" yönteminin aynı olmasını istiyorum - geçerli URI'yi "State" durumuna kaydedin. Bunu miras yoluyla yapmak istedim, ama yaratılan kodlara dayanarak yapamadım gibi görünüyor. Yapabileceğim başka bir yol var mı? –

+0

Uygulamanızda MVVM kullanıyor musunuz? MVVMLight araç setini kullandım ve uygulamadan verileri etkin bir şekilde saklamak için mesaj filtreleriyle OnNavigatedFrom/OnNavigatedTo ile birlikte Messenger sınıfını kullandım. – indyfromoz

+0

Uygulamamda açıkça MVVM kullanmıyorum. MVVMLight Windows Phone 7 için kullanılabilir mi? –