UWP 개발, Routed Event

Universal Windows Platform (UWP) 개발에서는 이벤트가 중요한 역할을 합니다. 이벤트는 사용자 인터페이스(UI)와 사용자의 상호작용을 연결하는 필수적인 요소입니다. 이벤트를 처리하기 위해서는 이벤트 핸들러가 필요하며, Routed Event는 UWP 애플리케이션에서 이벤트가 어떻게 전파되는지를 설명하는 메커니즘입니다. 이 글에서는 Routed Event의 개념, 사용 예제, 그리고 다양한 프로그래밍 기법에 대해 자세히 알아보겠습니다.

Routed Event란?

Routed Event는 UWP에서 발생하는 이벤트의 패턴으로, 이벤트가 발생한 요소에서 부모 요소로 또는 부모 요소에서 자식 요소로 전파될 수 있는 구조를 가지고 있습니다. 이를 통해 이벤트가 필요로 하는 위치에서만 처리될 수 있도록 하며, UI 트리의 여러 요소 간의 동작을 간소화합니다.

Routed Event는 세 가지 주요 전파 방향을 가지고 있습니다:

  • Bubbling: 이벤트가 자식 요소에서 부모 요소로 전파됩니다. 이는 일반적으로 UI 요소가 조작되었을 때 발생합니다.
  • Tunneling: 이벤트가 부모 요소에서 자식 요소로 내려갑니다. 이 방식은 더 높은 우선권을 가진 이벤트 처리기를 사용하고자 할 때 유용합니다.
  • Direct: 이벤트가 특정 요소에서 직접 처리됩니다. 이는 기본 이벤트 처리를 수행할 때 사용됩니다.

Routed Event 생성하기

Routed Event는 사용자 정의 이벤트로 작성할 수 있습니다. UWP에서 Routed Event를 생성하는 방법은 다음과 같습니다:

csharp
// RoutedEventManager를 사용하여 이벤트 등록
public static readonly RoutedEvent MyCustomEvent = EventManager.RegisterRoutedEvent(
    "MyCustom",
    RoutingStrategy.Bubbling,
    typeof(RoutedEventHandler),
    typeof(MyControl));

public event RoutedEventHandler MyCustom
{
    add { AddHandler(MyCustomEvent, value); }
    remove { RemoveHandler(MyCustomEvent, value); }
}

// 이벤트 발생 메서드
protected virtual void RaiseMyCustomEvent()
{
    RoutedEventArgs args = new RoutedEventArgs(MyCustomEvent);
    RaiseEvent(args);
}

위의 코드에서 우리는 MyControl라는 사용자 정의 컨트롤을 생성하고, MyCustomEvent라는 Routed Event를 등록했습니다. 이벤트 핸들러는 MyCustom 속성을 추가함으로써 이벤트를 추가 및 제거할 수 있습니다. 마지막으로, RaiseMyCustomEvent 메서드는 이벤트를 발생시키는 메서드입니다.

Routed Event 사용하기

이제 사용자 정의 Routed Event를 생성했으므로 실제로 사용해 볼 차례입니다. 아래의 예제를 통해 Routed Event를 어떻게 활용할 수 있는지 알아보겠습니다:

csharp
// 사용자 정의 컨트롤 클래스
public sealed class MyControl : Control
{
    public MyControl()
    {
        this.DefaultStyleKey = typeof(MyControl);
        this.PointerPressed += OnPointerPressed; // 포인터 클릭 이벤트 핸들링
    }

    private void OnPointerPressed(object sender, PointerRoutedEventArgs e)
    {
        RaiseMyCustomEvent(); // MyCustom 이벤트 발생
    }
}

// XAML 코드에서 사용자 정의 컨트롤 사용
<Page
    x:Class="MyApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <StackPanel>
        <local:MyControl MyCustom="MyControl_MyCustom"/>
    </StackPanel>
</Page>

// 이벤트 핸들러(XAML.cs)
private void MyControl_MyCustom(object sender, RoutedEventArgs e)
{
    // 사용자 정의 이벤트 처리
    Debug.WriteLine("MyCustom Routed Event 발생!");
}

위의 코드에서는 MyControl을 생성하고, 사용자가 클릭했을 때 MyCustom 이벤트를 발생시키고 있습니다. XAML에서 이 이벤트를 연결하여 이벤트를 처리하는 방법을 보여줍니다. 이벤트가 발생하면 MyControl_MyCustom 메서드가 호출되어 debug 로그에 메시지를 출력합니다.

Routed Event와 Delegates

UWP에서 Routed Event는 Delegates를 통해 구현됩니다. Routed Event 핸들러는 특정 시그니처를 가지며, 이는 라우팅되는 이벤트와 연결됩니다. 다음은 Delegate 사용 예입니다:

csharp
public delegate void CustomEventHandler(object sender, CustomEventArgs e);
public event CustomEventHandler CustomEvent;

protected virtual void OnCustomEvent(CustomEventArgs e)
{
    CustomEvent?.Invoke(this, e); // 이벤트 발생
}

이와 같이 Delegate를 사용하여 복잡한 로직을 구현할 수 있으며, 더 많은 이벤트 데이터와 함께 사용자 정의 이벤트를 보낼 수 있습니다.

마무리

Routed Event는 UWP 개발에서 사용자 인터페이스와 사용자의 상호작용을 효율적으로 처리할 수 있도록 하는 강력한 도구입니다. 이벤트를 발생시키고 처리하는 방법, 사용자 정의 이벤트 생성, 및 Delegates를 활용하는 방법에 대해 살펴보았습니다. 이 이해를 바탕으로 UWP 애플리케이션의 인터페이스 및 사용자 경험을 한층 더 향상시킬 수 있습니다.

이제 여러분도 Routed Event를 활용하여 더 나은 UWP 앱을 개발하는 데에 도움이 되기를 바랍니다. 궁금한 점이 있다면 언제든지 댓글로 질문해 주세요!