본문 바로가기

WindowPhone/Silverlight

NavigationService.BackStack 삽질 story

이번에 삽질 했던 내용을 공유하고자 한다. 크헝

WidnowsPhone은 NavigationService을 통해서 페이지간의 Navigate을 지원하게 된다(http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394012(v=vs.92).aspx)

 

그리고 Navigate된 페이지들은 BackStack에 차곡차곡 쌓이게 된다. 예를 들어 1,2,3페이지를 이동하면 1,2,3페이지가 BackStack에 들어가 있게 된다. 여기서 3번 페이지에서 1번 페이지로 간다고 했을 때 바로 3번 페이지에서 Navigate을 하게 되면 BackStack에는 1,2,3,1 이렇게 되는데, 이러한 방법이 아닌 실제로 처음에 봤던 1번 페이지로 이동하는 방법에서 내가 삽질했던 내용을 공유하고자 한다.

 

테스트 내용은 단순하다.

1->2->3 페이지로 이동을 했다가 3에서 1로 다시 back을 하도록 한다.

그래서 해봤다

     

3번 페이지에서 AppBarButton을 클릭 했을 때  

 Stack backStack = this.NavigationService.BackStack as Stack;
 backStack.Pop();
 this.NavigationService.GoBack();

backStack에서 하나을 꺼내고(pop) 그렇다면 2번페이지 거기서 다시 GoBack을 한다고 생각을 했다!!!

그랬더니 결과는 다음과 같다

오옷~ 1번페이지다!! 그런데 자세히 보면 먼가 이상하다!!

그렇다 ApplicationBar는 아직 2번페이지의 그것이다!! 정말로 페이지만 pop되었고 applicationbar는 관리가 안되었다!!

여기서 우리는 page와 applicationbar의 navigate stack이 다르다는 것을 막연하게 느낄 수 있을 것이다.

그렇다면 어떻게 applicationbar의 navigation backstack에 접근해서 pop해줄것인가?! 하는 고민을 잠깐만 했고, 그 고민은 더 이상 이어가지 않았다.

대신 NavigationService에서 다음과 같은 메서드를 찾아내었다.

  this.NavigationService.RemoveBackEntry();

위의 메서드를 위에서 작성했던 backStack.Pop(); 대신에 사용해준다면

이와 같이 정상적으로 이동하는 것을 확인 할 수 있다.

머 시간이 되면 ApplicationBar쪽의 Navigate방식에 대해서 알아보고 싶지만 일단은 Pass~