2011-08-02 13 views
5

Zadałem to pytanie w podobnym poście, ale od tego czasu nastąpiły znaczące aktualizacje, ale nadal nie ma wyników, więc postaram się ponownie zadać pytanie z aktualnymi informacjami.Przycisk Start i Wstecz wciśnięty w krótkim odstępie czasu WP7

Zasadniczo mam widok przestawny z 4 elementami obrotu. Jeśli utworzę scenariusz, w którym uderzyłem w klawisz Windows, a następnie szybko naciśnij klawisz powrotu, moja aplikacja zostanie ponownie otwarta bez rekonstrukcji (jest to oczekiwany wynik). Funkcjonalność aplikacji już istnieje. Mogę naciskać przyciski paska aplikacji itp.

Co nie działa, to elementy przestawne są zamrożone. Jeśli znajdowałem się na pozycji Pivot A i szybko naciskałem przycisk Start i Wstecz, wracam do pozycji Pivot A. Jeśli spróbuję zmienić elementy Pivot, ekran się nie zaktualizuje, jest "zamrożony" na pozycji Pivot A ALE funkcjonalność Pivot Item B tam jest. (Wiem o tym, ponieważ teraz wyświetlane są ikony paska narzędzi dla elementu przestawnego B).

Przeczytałem wiele artykułów na temat prawidłowych scenariuszy z tombstoning i jak podejść do tego problemu. Moje dane są prawidłowo nagrywane, a po ponownej aktywacji działają dane z nagrobkiem. Żadne obiekty nie są puste, więc nie mam żadnych wyjątków.

Sprawdzam, czy muszę przeładować Main ViewModel (nie muszę w tym przypadku, aby początkowo tworzone elementy interfejsu użytkownika nie były ponownie tworzone).

Rozwiązanie problemu polega jednak na rekonstrukcji aplikacji. Powiedzmy, że wchodzę na rynek z mojej aplikacji, pozwól mu zakończyć ładowanie i naciśnij wstecz, Moja aplikacja zostanie odświeżona i działa poprawnie, ponieważ poprawnie dezaktywuje i rekonstruuje istelf. Nie polegam na konstruktorach wykonujących całą pracę, więc nie brakuje mi żadnych kluczowych elementów, które nie są ustawione, gdy nie są uruchamiane w scenariuszu windows/back button.

Czy ktoś ma pojęcie, dlaczego mój ekran nie aktualizuje się?

konstruktor/event ładowany/na przejściu do imprezy

public MainPage() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 
    private void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (App.firstTimeLoading == true) 
     { 
      App.firstTimeLoading = false; 
     } 
     BuildApplicationBar(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     this.DataContext = App.ViewModel; 
     App.viewIdentifier = StringResource.MainPageView; 

     if (!App.ViewModel.IsDataLoaded) 
     { 
      App.ViewModel.LoadData();     

      String bookTitle; 
      App.Parser.appBookInfoDict.TryGetValue(CPlayerInventoryKeys.kInventoryKeyTitleShortTitle, out bookTitle); 
      PivotBackground.Title = bookTitle.ToUpper(); 

      CreatePivotItems(); 
     } 
     if (App.playerController.chapterPlayer.Source == null) 
      App.restoreStateClass.RestoreState(); 

     //applies the proper background image 
     if (App.isDarkTheme) 
     { 
      BitmapImage bitmapImage = new BitmapImage(new Uri(StringResource.PanoramaBlackImage, UriKind.Relative)); 
      BackgroundImage.ImageSource = bitmapImage; 
      BackgroundImage.Opacity = .85; 
     } 
     else 
     { 
      BitmapImage bitmapImage = new BitmapImage(new Uri(StringResource.PanoramaWhiteImage, UriKind.Relative)); 
      BackgroundImage.ImageSource = bitmapImage; 
      BackgroundImage.Opacity = .5; 
     } 

     if (App.firstTimeLoading == false && PivotBackground.SelectedItem != SuggestedPivotItem) 
      BuildApplicationBar(); 
     else if (PivotBackground.SelectedItem == SuggestedPivotItem) 
     { 
      BuildMarketPlaceApplicationBar(); 
     } 
     base.OnNavigatedTo(e); 
    } 
+0

Masz pełną repro, którą możesz udostępnić? –

+0

Zostałem zaktualizowany za pomocą jakiegoś kodu relavent, wciąż krok po kroku debugowania tego chociaż –

Odpowiedz

0

Znalazłem odpowiedź. Ponieważ miałem otwarty element multimedialny (odtwarzany/wstrzymany) i wdrażałem metodę "nie tombstonowania" polegającą na bardzo szybkim naciśnięciu przycisku okna i przycisku wstecz, źródło elementu multimedialnego było uszkodzone. Mimo że zresetowałem to źródło, najwyraźniej można je zignorować i nie działać poprawnie. Jedyne, co musiałem zrobić, to dodać linię kodu do programu obsługi dezaktywacji aplikacji.

private void Application_Deactivated(object sender, DeactivatedEventArgs e) 
    { 
     App.MainAudioPlayer.Source = null; //(only showing line added) 
    } 
0

Zachowanie opisujesz wydaje się być wyłącznie związane ze sposobem jesteś manipulowania danymi wewnętrznie i buduje swój układ. Przetestowałem to zarówno w emulatorze, jak i na kilku fizycznych urządzeniach, które generują normalne wyniki (nawet jeśli są powiązane z modelem widoku).

Spróbuj utworzyć nową aplikację Pivot (bez wszystkich danych - wystarczy użyć domyślnego szablonu) i sprawdź, czy problem nadal występuje. Warto również wspomnieć - czy testujesz na urządzeniu czy emulatorze?

+0

Będę próbował niektóre rzeczy, o których rozmawialiśmy ostatniej nocy. Pamiętam jednak, że nawet komentowanie wszystkich moich powiązań modelu widoku dla strony głównej i problem nadal występował. –

+0

Interesujące, rozwiązałem problem z jednym z moich poglądów, co jest dobrą wiadomością! Dziwna część jest dla głównego widoku. W Zdarzeniu OnNavigatedTo ustawiam to zdarzenieLoaded i po uruchomieniu wszystkich innych funkcji, nigdy nie trafi on załadowanego zdarzenia dla widoku głównego. –

+0

Czy rzeczywiście załadowane jest zdarzenie Loaded? –

0

Czy używasz przejść z zestawu narzędzi?
Czy są zdefiniowane w XAML?

Jeśli tak, to może być problem. Jest błąd, który został naprawiony w następnej wersji.
Na razie rozwiązaniem jest usunięcie przejść lub zdefiniowanie ich w kodzie.

+0

Używam przejść z zestawu narzędzi. Na przykład: RootFrame = new Microsoft.Phone.Controls.TransitionFrame(); I tak, są one zdefiniowane w xaml, źle widzę, co ich teraz usuwa. –

+0

Wyłączyłem przejścia i nie zmieniłem. Wybór Pivot Zmień zdarzenia, ale ekran nadal się zacina. –

Powiązane problemy