본문 바로가기

WPF

[WPF] Routed Event

◈ Routed Event?

1) 라우트된 이벤트는 이벤트를 일으킨 개체에서만이 아니라 요소 트리의 여러 수신기에서 처리기를 호출할 있는 이벤트 형식

2) 라우트된 이벤트는 CRL 이벤트의 인스턴스에서 지원되는 RoutedEvet 클래스에서 처리되는 WPF 이벤트 시스템

3) 라우트 이벤트는 이벤트를 발생시킨 오브젝트가 아닌 요소 트리의 여러 리스너에서 핸들러를 호출 있는 이벤트 유형

4) 기본적으로 Routed Event 클래스의 인스턴스에서 지원하는 CLR 이벤트입니다.

5) WPF 이벤트 시스템에 등록

 


◈ RoutedEvent 가지 주요 전략

1) Direct Event

소스 요소 자체만 응답으로 처리기를 호출할 수 있습니다. 이 전략은 Windows Forms에서 이벤트에 사용하는 “라우트”와 비슷합니다. 그러나 표준 달리 CLR 이벤트 클래스 처리를 지원 하는 라우트된 이벤트를 직접 (클래스 처리는 이후 섹션에서 설명)으로 사용할 수 있습니다


2) Bubbling Event

이벤트 소스에서 이벤트 처리기가 호출됩니다. 라우트된 이벤트는 요소 트리 루트에 도달할 때까지 다음 부모 요소로 라우트됩니다. 대부분의 라우트된 이벤트는 버블링 라우트 전략을 사용합니다. 버블링 라우트된 이벤트는 일반적으로 개별 컨트롤 또는 기타 UI 요소에서 입력 또는 상태 변경을 보고하는 데 사용됩니다


3) Tunnel Event

처음에 요소 트리 루트에 있는 이벤트 처리기가 호출됩니다. 그 다음에 라우트된 이벤트는 경로를 따라 있는 다음 자식 요소를 통해 경로를 이동하여 라우트된 이벤트 소스인 노드 요소(라우트된 이벤트를 발생시킨 요소)를 향합니다. 터널링 라우트된 이벤트는 보통 컨트롤 합치기의 일부로 사용 또는 처리되므로 복합 부분의 이벤트가 의도적으로 전체 컨트롤에 관련된 이벤트에 의해 억제되거나 대체될 수 있습니다. WPF에서 제공된 입력 이벤트는 터널링/버블링 쌍으로 구현됩니다. 쌍에 사용되는 명명 규칙 때문에 터널링 이벤트를 미리 보기 이벤트라고도 합니다.


 

◈ 예제

[XAML]

Title="MainWindow" Height="450" Width="800"  ButtonBase.Click="Window_Click">

 

<Grid>

<StackPanel Margin = "20" ButtonBase.Click="StackPanel_Click">

 

<StackPanel Margin = "10">

     <TextBlock Name = "txt1" FontSize = "18" Margin = "5" Text = "This is a TextBlock 1" />

<TextBlock Name = "txt2" FontSize = "18" Margin = "5" Text = "This is a TextBlock 2" />

<TextBlock Name = "txt3" FontSize = "18" Margin = "5" Text = "This is a TextBlock 3" />

</StackPanel>

 

<Button Margin = "10" Content = "Click me" Click="Button_Click" Width = "80"/>

</StackPanel>

    </Grid>

 

[Code]

        private void Button_Click(object sender, RoutedEventArgs e)

        {

            txt1.Text = "Button is Clicked";

        }

 

        private void StackPanel_Click(object sender, RoutedEventArgs e)

        {

            txt2.Text = "Click event is bubbled to Stack Panel";

            e.Handled = true; // 이벤트 발생은 중지 시키는 속성

        }

 

        private void Window_Click(object sender, RoutedEventArgs e)

        {

            txt3.Text = "Click event is bubbled to Window";

        }

 

 

 


'WPF' 카테고리의 다른 글

[WPF] 다른 쓰레드에서 UI 쓰레드 접근하기  (0) 2018.08.09
[WPF] Prism  (0) 2018.07.04
[WPF] MVVM  (0) 2018.07.04