본문 바로가기

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

08 NavigationService

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

WPF
에서 NavigationService를 이용하면 앞에서와 같은 페이지와 페이지 호스트간의 서로 독립적인 관계를 이룰 수 있다. NavigationService는 네비게이션, 네비게이션 히스토리, 네비게이션 생명주기(lifetime)등을 포함한 네비게이션 엔진의 기본적인 기능들을 구현하고 있다. 다음은 NavigationService타입의 주요 멤버들을 보여주고 있다.

sealed class NavigationService : IContentContainer

{

  // Navigation

  public bool Navigate(Uri source); // Navigate to URI

  public void Refresh(); // Re-navigate to current content

  public void StopLoading(); // Stop current navigation

  // Navigation History

  public bool CanGoBack { get; } // Content in back nav. history?

  public bool CanGoForward { get; } // Content in forward nav. history?

  public void GoBack(); // Go to previous content in nav. history

  public void GoForward();  // Go to next content in nav. history

  // Navigation Lifetime

  // Navigation requested

  public event NavigatingCancelEventHandler Navigating;

  // Navigated to content

  public event NavigatedEventHandler Navigated;

  // Content loaded

  public event LoadCompletedEventHandler LoadCompleted;

  // Navigation error

  public event NavigationFailedEventHandler NavigationFailed;

  // Bytes downloaded

  public event NavigationProgressEventHandler NavigationProgress;

  // Navigation stopped

  public event NavigationStoppedEventHandler NavigationStopped;

  // Content

  public object Content { get; set; } // The currently loaded content

  public Uri CurrentSource { get; }  // The URI for the current content

  public Uri Source { get; set; }   // The URI for the current content

  // or, if navigating, the URI for the

  // content being navigated to

  // Find a navigation service

  public static NavigationService GetNavigationService(

     DependencyObject dependencyObject);

}

NavigationWindow은 자기의 네비게이션 엔진을 구현하지 않는다. 대신에 NavigationService 인스턴스를 사용한다. Page는 실제로 자신을 호스팅하는 NavigationWindow NavigationService 참조를 GetNavigationService라는 메소드를 이용해서 얻을 수 있다.

// HomePage.xaml.cs (codebehind)

public partial class HomePage : Page

{

  void viewHyperlink_Click(object sender, RoutedEventArgs e)

  {

  // View Order

  ViewOrderPage page = new ViewOrderPage(GetSelectedOrder());

  NavigationService ns =

     NavigationService.GetNavigationService(this);

  ns.Navigate(page);

  }

  Order GetSelectedOrder() { ... }

  ...

}

이로써 Page가 그것의 호스트를 구체적으로 알지 못해도 네비게이션을 독립적으로 수행할 수 있도록 해 준다. 이런 요구 사항은 흔히 있을 수 있는 일이므로 Page NavigationService라는 헬퍼 속성을 가지고 있는데 동일한 역할을 한다.

// HomePage.xaml.cs (code-behind)

public partial class HomePage : Page

{

  void viewHyperlink_Click(object sender, RoutedEventArgs e)

  {

  // View Order

  ViewOrderPage page = new ViewOrderPage(GetSelectedOrder());

  this.NavigationService.Navigate(page);

  }

 

  Order GetSelectedOrder () { ... }

  ...

}

그림 7NavigationWindow, NavigationService, 그리고 Page간의 관계를 나타낸다. 보는 것 처럼, NavigationWindow NavigationServiceConten속성을 다시 구현하고 있다. NavigationWindow은 이런식으로 NavigationService 멤버 대부분을 재 구현하고 거기에 몇가지를 더 추가하고 있다. 예를 들어 NavigationWindow NavigationService를 각각 이용해서 네비게이션 히스토리상의 전, 후로 이동할 수 있다.

1339054825
그림 7 관계

WPF에서는 네비게이터(navigatior)라고 해서 3종류의 호스트가 있다 : NavigationWindow, Frame, 브라우저(WPF1.0에서는 IE 6.0이상). 앞의 코드에서처럼 페이지가 자신의 NavigationService 속성을 사용하도록만 코딩된다면 그림에서처럼 아무 변경 없이도 페이지를 이 3개의 네이게이터에서 호스팅될 수 있다.

1019442981
그림 8 네비게이션 코드

이런 관계를 알았다면, 이제 독립현 애플리케이션에서 호스팅된 페이지를 IE를 사용해서도 어떤 곳에서든지 호출해 볼 수 있다는 것이 가장 흥미로울 것이다.

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

09 XAML Browser Applications  (0) 2009.04.23
07 NavigationWindow  (0) 2009.04.23
06 Hyperlink  (0) 2009.04.23