WPF(Windows Presentation Foundation)에서 Prism 프레임워크를 사용하여 애플리케이션을 개발할 때, 내비게이션은 매우 중요한 기능입니다. 이 글에서는 Prism에서 내비게이션을 구현하는 방법, 페이지 간 이동, 그리고 매개변수를 전달하는 방법을 상세히 설명하겠습니다.
1. Prism 프레임워크 개요
Prism은 WPF 애플리케이션을 모듈식으로 개발할 수 있게 해주는 강력한 프레임워크입니다. MVVM(모델-뷰-뷰모델) 패턴을 지지하며, 의존성 주입, 이벤트 발행, 그리고 내비게이션 기능을 제공합니다. Prism의 강력한 내비게이션 기능 덕분에 우리는 다양한 페이지 간에 쉽고 안전하게 전환할 수 있습니다.
2. Prism 내비게이션의 구성 요소
2.1 INavigationService
Prism의 INavigationService
인터페이스는 내비게이션 작업을 수행하는 주요 인터페이스입니다. 이 서비스는 다음과 같은 중요한 메서드를 제공합니다:
-
NavigateAsync(string uri)
: URI를 기반으로 새 페이지로 이동합니다. -
GoBackAsync()
: 이전 페이지로 돌아갑니다. -
GoForwardAsync()
: 다음 페이지로 이동합니다. -
RequestNavigate(NavigationParameters parameters)
: 매개변수를 포함하여 페이지를 내비게이션합니다.
2.2 NavigationParameters
NavigationParameters
클래스는 페이지 간에 데이터를 전달할 수 있는 기능을 제공합니다. 이는 주로 NavigateAsync
메서드 호출 시 전달되며, 페이지 간의 데이터 전송을 용이하게 해줍니다.
3. Prism 내비게이션 설정하기
3.1 PrismApplication 설정
Prism 애플리케이션을 시작하기 위해, PrismApplication
클래스를 상속받은 클래스를 생성합니다.
public class App : PrismApplication
{
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// 서비스 등록
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation();
}
protected override void OnInitialized()
{
InitializeComponent();
NavigationService.NavigateAsync("MainPage");
}
}
3.2 페이지 구성
이제 두 개의 페이지 MainPage
와 SecondPage
를 생성하고, 이들 간의 내비게이션을 설정해 보겠습니다.
public partial class MainPage : ContentPage
{
public MainPage(IRegionManager regionManager)
{
InitializeComponent();
NavigateToSecondPage(regionManager);
}
private async void NavigateToSecondPage(IRegionManager regionManager)
{
var parameters = new NavigationParameters();
parameters.Add("Message", "Hello from MainPage!");
await regionManager.RequestNavigate("ContentRegion", "SecondPage", parameters);
}
}
4. 페이지 간 이동하기
위의 코드에서 RequestNavigate
메서드를 통해 MainPage
에서 SecondPage
로 이동하며, 매개변수(“Message”)를 전달합니다.
public partial class SecondPage : ContentPage, INavigatedAware
{
public void OnNavigatedTo(NavigationContext navigationContext)
{
if (navigationContext.Parameters.ContainsKey("Message"))
{
var message = navigationContext.Parameters.GetValue("Message");
DisplayAlert("Message", message, "OK");
}
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
public void OnNavigatedFrom(NavigationContext navigationContext) { }
}
5. 매개변수 전달 및 사용하기
SecondPage
의 OnNavigatedTo
메서드에서 전달된 매개변수를 수신하고, 메시지를 사용자에게 알립니다. 여기서 INavigatedAware
인터페이스는 페이지가 내비게이션에 어떻게 반응할지를 정의하는데 필요합니다.
5.1 매개변수 추가하기
매개변수를 추가하는 것은 매우 간단합니다. 페이지로 이동하기 전에 NavigationParameters
객체에 필요한 키와 값을 추가하기만 하면 됩니다.
private void NavigateToSecondPage(IRegionManager regionManager)
{
var parameters = new NavigationParameters();
parameters.Add("Message", "Hello from MainPage!");
parameters.Add("UserID", 1234);
await regionManager.RequestNavigate("ContentRegion", "SecondPage", parameters);
}
5.2 다중 매개변수 수신하기
다중 매개변수를 수신하려면 OnNavigatedTo
메서드에서 각 키를 확인하고 처리하면 됩니다.
public void OnNavigatedTo(NavigationContext navigationContext)
{
if (navigationContext.Parameters.ContainsKey("Message") && navigationContext.Parameters.ContainsKey("UserID"))
{
var message = navigationContext.Parameters.GetValue("Message");
var userId = navigationContext.Parameters.GetValue("UserID");
DisplayAlert("User ID", $"Message: {message}, UserID: {userId}", "OK");
}
}
6. 내비게이션 히스토리 관리
Prism은 내비게이션 히스토리를 자동으로 관리하여 사용자에게 ‘뒤로’ 및 ‘앞으로’ 기능을 제공합니다. INavigationService
를 사용하여 이러한 기능을 쉽게 구현할 수 있습니다.
private async void GoBack()
{
if (NavigationService.CanGoBack)
{
await NavigationService.GoBackAsync();
}
}
7. 사용자 경험 개선하기
비동기 내비게이션 메서드 호출 시, 사용자의 인터페이스가 불편해지지 않도록 고민해야 합니다. 예를 들어, 내비게이션 중 로딩 스피너를 표시하거나 비활성화된 상태를 유지할 수 있습니다.
private async void NavigateToSecondPage(IRegionManager regionManager)
{
IsBusy = true; // 로딩 시작
var parameters = new NavigationParameters();
parameters.Add("Message", "Hello from MainPage!");
await regionManager.RequestNavigate("ContentRegion", "SecondPage", parameters);
IsBusy = false; // 로딩 종료
}
8. 결론
Prism에서 내비게이션을 구현하는 과정은 간단하면서도 강력한 사용자 경험을 제공합니다. 페이지 간에 매개변수를 전달하고, 내비게이션 상태를 관리하는 기능을 통해 애플리케이션의 유연성을 크게 향상시킬 수 있습니다.
이 글에서 다룬 내비게이션의 기초 개념을 바탕으로, 다양한 UI 구조를 가진 복잡한 애플리케이션을 설계하는 데 있어 Prism의 내비게이션 기능을 활용해보시기를 바랍니다.
이 글이 WPF와 Prism을 사용하여 내비게이션을 구현하는 데 도움이 되었기를 바랍니다. 여러분의 애플리케이션 개발에 성공을 기원합니다!