티스토리 뷰

WindowsPhone

WP7 개발 기초 - 페이지간 데이터 삽입

생각많은 소심남 2011. 12. 27. 16:53

지난 포스팅에서 잠깐 언급한 것처럼 app class를 이용한 데이터 공유는 편리하긴 하지만 단순히 페이지 네비게이션에만 쓸거면 다른 방식을 사용하는게 좋다고 책에 언급되어 있습니다. 이 때 사용되는 메서드가 바로 OnNavigateFrom 입니다.

이걸 쓰게 되면 Navigate나 Goback 같은 메서드를 통해서 다른 페이지로 넘어가도 페이지는 자기 위치를 인지하게 되는 거지요.
OnNavigateTo 메서드의 정의를 자세히 보시면


와 같이 NavigationEventArgs 이벤트 인수가 정의되어 있는데 이는


에서도 똑같이 정의됩니다. 여기에는 파일의 위치를 나타내는 Uri형 Uri와 개체형 Content 두 속성을 포함하고 있습니다. 그래서 페이지는 이 속성들을 통해서 정보를 얻게 되는 겁니다.

그냥 간략하게 예를 들자면 사람이 장소를 이동할때 사람뒤에 끈을 메고 갔다가 되돌아가기위해서 끈을 잡고 돌아가는 형식을 띄게 됩니다. 그리고 끈을 잡으면 이전에 자기가 있던 곳의 위치같은 정보를 바로 얻을 수있게 된다고 보시면 될거 같습니다.

지지난 포스팅에서 stack에 대한 이야기를 하면서 인스턴스에 대한 이야기도 잠깐했습니다. 그래서 위와 같은 메서드를 통해서 Uri와 content를 가진 인스턴스가 나와 stack의 형태를 띄면서 쌓이게 됩니다.

이번에 해볼 예제에선 mainPage 상에서 배경색이 랜덤하게 변하지는 않고 SecondPage의 색상이 그대로 따라가는 것을 구현했습니다. MainPage.xaml.cs에서 다음과 같이 짭니다.


우선 전역적으로 쓸 수 있도록  public으로 지정하고 되받을 색상을 ReturnedColor 라고 표현해줍니다.

지금은 단순히 Textblock을 눌렀을 때는 mainPage의 배경색이 변하는 것이 아니므로 단순히 Navigate 메서드로만 표현합니다.

그리고 되받은 색깔(여기서는 Second Page에서 받은 배경색이겠지요) 이 있으면 그 색깔로 다시 MainPage를 입히라는 걸 표현한 겁니다.

SecondPage도 다음과 같이 수정이 됩니다.


여기서 보면 일단 Second Page는 랜덤하게 배경색이 변하고 그 색을 Main으로 넘겨줘야 하기 때문에 랜덤에 관련된 메서드는 그대로 살아있습니다. 다만 이전 프로젝트와 다른점이 있다면 TextBlock을 눌렀을 때는 단순히 뒤로 돌아간다는 점, 그리고 이번 포스팅에서 언급되고 있는 OnNavigatedFrom 메서드가 삽입되어 있습니다.

이는 현재 페이지에서 다른 페이지로 넘어올 때 활성화 되는 것으로, 지금 보시면 MainPage에서 public으로 선언된 returnedColor가 SecondPage상의 배경색으로 저장되고 있는 것을 확인하고 있습니다. 그래서 이렇게 하면 결과는 다음과 같습니다.



MainPage상에서 눌러도 반응이 없습니다.
그리고 SecondPage상에서 배경색을 변화시켰을때 TextBlock을 누르면 그 값이 유지되어 MainPage로 전달되게 됩니다. 그리고 다시 Second Page로 넘어갈시에는 기본 배경색으로 초기화가 되는 것을 확인할 수 있습니다.

뭔가 된 거 같긴 하는데 실제로 저희가 추구하는 목표는 아닙니다. 저희의 목표는 app.xaml을 통하지 않고 Navigate 메서드만 통해서 페이지 네비게이션시 배경색이 전페이지의 것과 계속 유지되는 것을 원하는데 지금은 MainPage에선 먹히지 않지요.
그럼 위와 같은 방법으로 SecondPage 상에도 구현하면 안될까요?

책에서의 언급한 답은 No! 입니다. 항상 바르게 동작하지 않는다는 것이 그 이유입니다. 그에 대한 해결책으로 IsolatedStorage과 같은 방편이 있는데 이부분은 후에 다루기로 하겠습니다.

댓글