TOC

This article has been localized into Korean by the community.

XAML:

XAML의 이벤트

현대 UI 프레임워크의 대부분은 이벤트를 기반으로 하며 WPF도 마찬가지 입니다. 윈도우(Control 클래스에서 상속)를 포함한 모든 컨트롤들은 구독하는 이벤트들을 사용자에게 노출시킵니다. 당신은 이벤트들을 구독하고 당신의 응용프로그램으로 이벤트가 발생할 때 알림을 받습니다.

다양한 타입의 이벤트들이 있지만, 일반적으로 사용하는 이벤트는 사용자가 마우스나 키보드를 조작하면서 응용프로그램과 상호작용 하는 것입니다. 가장 많이 사용하는 컨트롤 이벤트는 키보드를 누르는 것, 키보드를 눌렀다가 떼는 것, 마우스를 누르는 것, 마우스를 이동 시키는 것, 마우스를 눌렀다 떼는 것 등 입니다.

우리는 WPF에서 이벤트들이 어떻게 작동하는 지 상세하게 알아볼 것입니다. 이 주제는 매우 복잡하지만, 지금 알아야 하는 것은 XAML에서 컨트롤 이벤트들이 Code-behind 파일의 코드와 어떻게 연결되는 지 입니다. 다음의 예제를 살펴보겠습니다 :

<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EventsSample" Height="300" Width="300">
	<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp" Background="LightBlue">        
		
    </Grid>
</Window>

어떻게 메소드의 이름을 쓰고 Grid의 MouseUp 이벤트를 정의하는지 확인합니다. 메소드는 적합한 event signature를 사용해 code-behind에 정의합니다. 이 경우에는 다음과 같습니다.

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
	MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
}

구독하는 MouseUp 이벤트는 MouseButtonEventHandler라는 델리게이트를 사용합니다. 이 델리게이트는 sender(이벤트를 발생시킨 컨트롤), MouseButtonEventArgs 2개의 파라미터를 가집니다. 두 객체는 유용한 정보를 담고 있습니다. 예제에서는 마우스 커서의 위치를 얻어내 우리에게 전달해줍니다.

몇 몇의 이벤트들은 동일한 타입의 델리게이트를 사용합니다. 예를 들어 MouseUp와 MouseDown은 모두 MouseButtonEventHandler 델리게이트를 사용합니다. 반면에 MouseMove는 MouseEventHandler 델리게이트를 사용합니다. 이벤트 핸들러 메소드를 정의할 때에는 어떤 델리게이트를 사용하는지 알아야 합니다. 만약 모를 때에는 문서에서 찾아볼 수 있습니다.

다행히도 Visual Studio는 적합한 이벤트 핸들러를 생성하는데 도움을 줍니다. 가장 쉬운 방법은 XAML에서 이벤트의 이름을 적기만 하는 것입니다. VS의 IntelliSense가 나머지 작업을 수행해줍니다.

<New Event Handler>를 선택하면 Visual Studio는 적절한 이벤트 핸들러를 Code-behind 파일에 생성해줍니다. 이름은 <control name>_<event name> 입니다. 이 경우에는 pnlMainGrid_MouseDown 입니다. 이벤트의 이름을 마우스 오른쪽 버튼으로 클릭해서 Navigate to Event Handler를 선택할 수 있습니다. 그럼 VS가 올바른 위치로 안내합니다.

Code-behind로 부터 이벤트 구독

위의 방법은 이벤트를 구독하는 가장 일반적인 방법입니다. 하지만 Code-behind 파일에 직접 이벤트를 구독하도록 하는 경우도 있습니다. 이때는 C# 문법인 += 를 이용합니다. 이벤트 핸들러를 객체 형태로 이벤트에 바로 추가하는 방법입니다. C# 예제에 이와 관련된 모든 설명이 있지만 비교를 위해서 다음의 예제를 확인해보겠습니다 :

using System;
using System.Windows;
using System.Windows.Input;


namespace WpfTutorialSamples.XAML
{
	public partial class EventsSample : Window
	{
		public EventsSample()
		{
			InitializeComponent();
			pnlMainGrid.MouseUp += new MouseButtonEventHandler(pnlMainGrid_MouseUp);
		}

		private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)
		{
			MessageBox.Show("You clicked me at " + e.GetPosition(this).ToString());
		}

	}
}

앞에서도 설명했듯이, 어떤 델리게이트를 사용해야 하는지 알아야하며 Visual Studio는 이를 도와줍니다. 다음을 작성하면 :

pnlMainGrid.MouseDown +=

Visual Studio가 도움을 줄 것입니다 :

간단하게 [Tab] 키를 두 번 두르면 Visual Studio가 적합한 이벤트 핸들러를 현재 메소드 바로 아래에 실행 준비 상태로 생성해줍니다. 이 방식으로 이벤트를 활용하면 XAML에서 작업할 필요가 없습니다.