0

두 페이지 Silverlight WP 응용 프로그램 : PageA 기본 페이지와 PageA에서 열고 매개 변수를 전달할 수있는 다른 PageB를 생각해 봅시다.WP8 Silverlight 페이지 응용 프로그램에서 삭제 표시 후 NavigationContext.QueryString이 지워지지 않음

NavigationService.Navigate(new Uri(
    "/EditEntryPage.xaml?ItemIndex=" + myItemIndex, UriKind.Relative)); 

을 그리고 매개 변수와 사건을 처리하기 위해이 페이지 B의 OnNavigatedTo/OnNaviagetdFrom 행사에 구성 다음 사용 : 찰스 페 졸드는 'WP7 프로그래밍'자신의 베스트 셀러에서 알 수 있듯이, 우리는이 같은 문을 사용하여 페이지 B를 인스턴스화 할 수 있습니다 앱을 삭제 표시 다시 활성화되었을 때 :

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    string myParam; 
    if (this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam)) 
    { 
     fItemIndex = int.Parse(myParam); 
    } 
    else if (PhoneApplicationService.Current.State.ContainsKey(APP_STATE_KEY_ITEM_INDEX)) 
    { 
     fItemIndex = (int)PhoneApplicationService.Current.State[APP_STATE_KEY_ITEM_INDEX]; 
    } 
} 

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    PhoneApplicationService.Current.State[APP_STATE_KEY_ITEM_INDEX] = fItemIndex; 
} 

그러나, 우리는 하나의 문제가 사용자가 페이지 B에서 응용 프로그램을 왼쪽 경우 응용 프로그램은 삭제 표시되고, 사용자는을 사용하여 동일한 페이지 B에 응용 프로그램에 다시 반환 작업 관리자. 이 경우 OnNavigatedTo 이벤트의 NavigationContext.QueryString은 페이지가 PageA에서 호출 된 것과 동일한 ItemIndex 매개 변수를 반환하고 두 번째 'if'는 실행되지 않습니다!

중요한 점 (앱 설정 등)을 놓쳤거나 WP8에서 동작이 변경되어 더 이상이 방법을 사용할 수 없습니까?

답변

0

쿼리 문자열 동작이 WP7에서 WP8로 변경되지 않았습니다. 그것이 uri에 있다면, 그것은 삭제 표시 또는 빠른 애플 리케이션 전환에서 재개시 거기에 머물러있을 것입니다.

차이점을 알려주는 한 가지 방법은 NavigationEventArgs.IsNavigationInitiator 속성을 사용하는 것입니다. 앱에서 탐색 할 때만 true이되고 OS에서 다시 시작할 때는 false이됩니다. 따라서 귀하의 첫 번째 증언을 다음과 같이 변경하려는 경우 예상대로 작동 할 수 있습니다.

if (e.IsNavigationInitiator 
     && this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam)) 
+0

본인은 앱 재 활성화와 내부 앱 탐색을 구별하는 데 사용할 수 있다는 데 동의합니다. 내 응용 프로그램에서는 동등한 솔루션을 사용합니다. 대신 NavigationEventArgs.NavigationMode를 분석합니다. 응용 프로그램에서 페이지를 열면 New이고, OS에서 돌아 오면 Back입니다. 그러나 제 질문의 키워드는 '묘비'입니다. 귀하의 요리법은 그것이 사실인지 여부를 알 수 없도록합니다. – TecMan