본문 바로가기

IT 살이/04. 기술 - 프로그래밍

07 NavigationWindow

이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다.

지금쯤이면 몇가지 의문 사항들이 있을 수 있을 것이다. Page가 윈도우는 아니라고 했다. 그렇다면 그것을 호스팅하는 윈도우는 어디서 왔는가? 하이퍼링크를 클릭하면 그 네비게이션을 실제로 처리하는 것은 무엇인가? 그리고 어떻게 해서 HTML 웹 페이지가 WPF 애플리케이션에서 출력될 수 있게 되는가? 이 모든 것을 담당하는 것은 NavigationWindow이다. 

Application.StartupUri 속성이 XAML 또는 HTML 페이로 설정되면 Application(이 페이지들은 자신들을 호스팅할 윈도우가 없다는 것을 알고 있다)은 그것들을 호스팅할 NavigationWindow 인스턴스를 생성한다.  NavigationWindow Window를 상속하는 클래스로서, 여기에 그림 6처럼 앞 뒤로 네비게이션이 가능한 브라우저와 조금 닮은 비주얼한 모양을 추가한다.

1273080631
그림 6 NavigationWindow에의해 생성된 윈도우.

사용자가 XAML 페이지에 있는 하이퍼링크를 클릭하면 Hyperlink NavigationWindow에 지정된 URI로 네비게이트할 것을 요청한다. NavigationWindow URI에 있는 페이지를 로딩해서 호스팅하게 된다. 페이지가 로딩된 URI 위치는 NavigationWindow.Source 속성에 저장되고, 로딩된 페이지의 컨텐트는 NavigationWindow.Content 속성을 통해서 접근할 수 있다.

컨텐트가 변경되면, 네비게이션이 완료된 것으로 간주되어서 이전의 컨텐트는 네비게이션 히스토리에 저장된다. 이것도 또한 NavigationWindow가 관리한다. NaviationWindow의 네비게이션용 UI는 두개의 버튼과 드롭다운 리스트를 제공한다. 개발자는 이렇게 기본적으로 제공되는 NavigationWindow의 스타일을 변경하여 새로운 네비게이션 UI를 쉽게 만들어 낼 수 있다.

지금까지는 하이퍼링크로 이동할 URI를 마크업을 이용해서 설정하는 방법을 보았다. 그러나 때로는 네비게이션을 이렇게 선언적으로 결정할 수 없는 경우도 있다. 예를 들어 주문 내용을 보기를 원한다면 Page 객체를 생성해서 그것을 사용자가 보기 원하는 주문을 건네줘야 할 필요가 있다. 이것은 선언적으로 될 수 없다. 대신에 다음처럼 코드를 사용할 수 있다.

HomePage.xaml (markup)

<Page ... >

  ...

  <Hyperlink Click="viewHyperlink_Click">

  View

  </Hyperlink>

  ...

</Page>

HomePage.xaml.cs (codebehind)

public partial class HomePage : Page

{

  void viewHyperlink_Click(object sender, RoutedEventArgs e)

  {

  // View Order

  ViewOrderPage page = new ViewOrderPage(GetSelectedOrder());

  NavigationWindow window =

     (NavigationWindow)this.Parent; // Don’t do this!

  window.Navigate(page);

  }

  Order GetSelectedOrder()

  {

  return (Order)this.ordersListBox.SelectedItem;

  }

  ...

}

하이퍼링크가 클릭되면, 그것의 클릭 이벤트 핸들러는 현재 선택된 주문을 얻어서 ViewOrderPage를 생성할 때 인자로 건네준다. 그리고 그것의 호스트 NavigationWindow Navigate 메소드를 호출하면 된다. 그럼, URI 대신에 객체를 사용해서 페이지로 이동할 수 있게 된다.

호스트 NavigationWindow에 대한 참조를 얻는 방법이 아마도 이상할지도 모르겠다. 이것은 Page가 그것을 호스팅하는 것에 대해서 명시적으로 알지 못하기 때문에 필요한 작업이다. 페이지는 Parent 속성을 통해서 자신의 호스트를 결정하지만 그러나 Parent 속성은 특정 호스트 타입에 대한 strongly-typed 참조 대신에 DependencyObject 타입의 참조를 리턴한다. 따라서 Parent를 특정 호스트 타입으로 캐스팅하게 되는데, 이것은 Page가 자신을 호스팅하는 것에 대한 타입을 알고 있다는 것을 의미한다. 그러나 알게 되겠지만 NavigationWindow만이 Page를 호스팅하는 것은 아니다. 따라서 페이지가 여러 타입의 호스트에서 호스팅될 수 있기를 바란다면 호스트 독립적인 방법으로 네비게이션을 수행할 필요가 있다.

'IT 살이 > 04. 기술 - 프로그래밍' 카테고리의 다른 글

08 NavigationService  (0) 2009.04.23
06 Hyperlink  (0) 2009.04.23
05 Page  (0) 2009.04.23