이 포스트는 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 () { ... } ... } |
그림 7은 NavigationWindow, NavigationService, 그리고 Page간의 관계를 나타낸다. 보는 것 처럼, NavigationWindow는 NavigationService의 Conten속성을 다시 구현하고 있다. NavigationWindow은 이런식으로 NavigationService 멤버 대부분을 재 구현하고 거기에 몇가지를 더 추가하고 있다. 예를 들어 NavigationWindow와 NavigationService를 각각 이용해서 네비게이션 히스토리상의 전, 후로 이동할 수 있다.
WPF에서는 네비게이터(navigatior)라고 해서 3종류의 호스트가 있다 : NavigationWindow, Frame, 브라우저(WPF1.0에서는 IE 6.0이상). 앞의 코드에서처럼 페이지가 자신의 NavigationService 속성을 사용하도록만 코딩된다면 그림에서처럼 아무 변경 없이도 페이지를 이 3개의 네이게이터에서 호스팅될 수 있다.
'IT 살이 > 04. 기술 - 프로그래밍' 카테고리의 다른 글
09 XAML Browser Applications (0) | 2009.04.23 |
---|---|
07 NavigationWindow (0) | 2009.04.23 |
06 Hyperlink (0) | 2009.04.23 |