[Prism] 011. Prism에서의 내비게이션 구현, 내비게이션 서비스 개요

저자: 조광형

날짜: 2024년 11월 26일

1. Prism 소개

Prism은 WPF(Windows Presentation Foundation) 응용 프로그램의 모듈화, 테스트 가능성 및 유지 관리성을 증진시키기 위한 프레임워크입니다.
Prism은 MVVM(모델-뷰-뷰모델) 디자인 패턴을 지원하여 개발자가 유연하게 응용 프로그램 구조를 설계할 수 있도록 도와줍니다.

이 글에서는 Prism에서 내비게이션 기능을 구현하기 위한 방법과 내비게이션 서비스에 대한 개요를 제공합니다. 내비게이션은 사용자 경험에서 중요한 요소로,
다양한 화면 간 전환이나 콘텐츠 표시를 관리하는데 핵심적인 역할을 합니다.

2. 내비게이션의 기본 개념

내비게이션은 사용자 인터페이스의 여러 뷰 간 전환을 통해 사용자가 응용 프로그램을 탐색하도록 돕는 과정을 의미합니다.
Prism에서는 이러한 내비게이션을 효과적으로 구현하기 위해 내비게이션 서비스(NavigationService)를 사용합니다.

2.1 내비게이션의 중요성

잘 설계된 내비게이션은 사용자가 응용 프로그램의 기능을 쉽게 이해하고 필요한 정보를 빠르게 찾을 수 있도록 돕습니다.
사용자 경험을 극대화하기 위해 다양한 내비게이션 패턴과 모델이 사용될 수 있습니다. Prism은 이러한 요구를 충족하기 위한 강력한 구성을 제공합니다.

3. Prism에서의 내비게이션 서비스

Prism의 내비게이션 서비스는 다양한 뷰 간에 원활한 전환을 가능하게 하는 인터페이스를 제공합니다. 이를 통해 각 뷰는 독립적으로 관리되고,
필요한 경우에만 로드될 수 있습니다. 이러한 구조는 모듈화된 애플리케이션 개발을 위한 기초가 됩니다.

3.1 INavigationService 인터페이스

INavigationService는 뷰 간 내비게이션을 관리하기 위한 기본 인터페이스입니다. 이 인터페이스는 뷰를 활성화하고,
매개변수를 전달하며, 이전 뷰로의 되돌리기를 지원합니다.


public interface INavigationService
{
    void NavigateAsync(string uri);
    void NavigateAsync(string uri, NavigationParameters parameters);
    void GoBack();
    void GoForward();
    bool CanGoBack { get; }
    bool CanGoForward { get; }
}
        

위 코드에서 볼 수 있듯이, 내비게이션 서비스는 여러 메소드를 제공하여 다양한 내비게이션 작업을 지원합니다.

3.2 NavigationParameters

NavigationParameters는 뷰를 전환할 때 추가적인 데이터를 전달하는 데 사용되는 클래스입니다. 이를 통해
서로 다른 뷰 간에 필요한 정보를 전송할 수 있습니다.


public class NavigationParameters : Dictionary
{
    public bool ContainsKey(string key);
    public object GetValue(string key);
}
        

매개변수를 사용함으로써 데이터의 동적 전달과 처리 및 뷰의 상태 관리가 용이해집니다.

4. 내비게이션 구현 예제

이번 섹션에서는 Prism을 사용하여 간단한 내비게이션 예제를 구현하여 내비게이션 서비스가 어떻게 작동하는지 보여드리겠습니다.
예제에서는 두 개의 뷰(페이지)를 생성하고 각 뷰 간에 데이터를 전송하며 전환하는 과정을 살펴보겠습니다.

4.1 프로젝트 설정

새로운 WPF 애플리케이션을 생성하고 Prism 라이브러리를 NuGet을 통해 추가합니다.
Install-Package Prism.Wpf 명령을 통해 설치할 수 있습니다.

4.2 뷰 생성

두 개의 뷰인 MainView와 SecondView를 생성합니다. MainView는 SecondView로의 내비게이션을
포함하고 있으며, SecondView는 데이터를 수신하고 표시하는 구조로 구성됩니다.

MainView.xaml

<UserControl x:Class="PrismExample.Views.MainView" ...>
    <StackPanel>
        <TextBox x:Name="InputTextBox" Width="200" />
        <Button Content="Go to Second View" 
                Click="NavigateButton_Click" />
    </StackPanel>
</UserControl>

SecondView.xaml

<UserControl x:Class="PrismExample.Views.SecondView" ...>
    <StackPanel>
        <TextBlock x:Name="ReceivedTextBlock" FontSize="24" />
        <Button Content="Back" Click="GoBackButton_Click" />
    </StackPanel>
</UserControl>

4.3 ViewModel 구현

각 뷰에 대한 ViewModel을 작성하여 내비게이션 로직을 처리합니다. MainViewModel은 사용자 입력을
받아 SecondView로 전송하는 역할을 합니다.


public class MainViewModel : BindableBase
{
    private readonly INavigationService _navigationService;

    public MainViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    private void NavigateButton_Click(object sender, RoutedEventArgs e)
    {
        var parameters = new NavigationParameters 
        {
            { "inputText", InputTextBox.Text }
        };

        _navigationService.NavigateAsync("SecondView", parameters);
    }
}
        

4.4 SecondViewModel 구현


public class SecondViewModel : BindableBase, INavigationAware
{
    private string _receivedText;
    
    public string ReceivedText
    {
        get => _receivedText;
        set => SetProperty(ref _receivedText, value);
    }

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        if (navigationContext.Parameters.ContainsKey("inputText"))
        {
            ReceivedText = navigationContext.Parameters.GetValue("inputText");
        }
    }

    public bool IsNavigationTarget(NavigationContext navigationContext) => true;

    public void OnNavigatedFrom(NavigationContext navigationContext) { }
}
        

4.5 애플리케이션 실행 및 테스트

애플리케이션을 실행하면 MainView가 표시되고, 사용자가 텍스트 박스에 입력한 내용을 기반으로 SecondView로 이동할 수 있습니다.
SecondView는 전달된 데이터를 수신하여 화면에 표시합니다. 이 과정을 통해 Prism의 내비게이션 서비스를 효과적으로 활용할 수 있습니다.

5. 결론

Prism에서의 내비게이션 서비스는 WPF 애플리케이션에서 뷰간 전환을 쉽고 일관되게 처리하는 데 중요한 역할을 합니다.
INavigationService와 NavigationParameters를 사용하여 개발자는 효율적으로 모듈화된 애플리케이션을 구축할 수 있으며,
사용자 경험을 극대화할 수 있는 기회를 갖게 됩니다. 본 문서에서 설명한 내용을 기반으로 더 복잡한 내비게이션 모델을 구현해 나가시길 바랍니다.