입력 개요

업데이트: 2007년 11월

WPF(Windows Presentation Foundation) 하위 시스템은 마우스, 키보드, 스타일러스를 비롯한 다양한 장치에서 입력을 가져오는 데 사용할 수 있는 강력한 API를 제공합니다.

이 항목에서는 WPF가 제공하는 서비스에 대해 설명하고 입력 시스템의 아키텍처를 살펴봅니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 입력 API
  • 이벤트 라우팅
  • 입력 이벤트 처리
  • 텍스트 입력
  • 포커스
  • 마우스 위치
  • 마우스 캡처
  • 명령
  • 입력 시스템 및 기본 요소
  • 새로운 기능
  • 관련 항목

입력 API

기본 입력 API는 기본 요소 클래스인 UIElement, ContentElement, FrameworkElementFrameworkContentElement에 노출됩니다. 기본 요소에 대한 자세한 내용은 기본 요소 개요를 참조하십시오. 이러한 클래스는 키 누르기, 마우스 단추, 마우스 휠, 마우스 이동, 포커스 관리, 마우스 캡처 등과 관련된 입력 이벤트를 위한 기능을 제공합니다. 입력 아키텍처는 모든 입력 이벤트를 서비스로 처리하는 대신 기본 요소에 입력 API를 배치함으로써 UI의 특정 개체가 입력 이벤트를 발생시키도록 하고, 둘 이상의 요소가 입력 이벤트를 처리할 수 있는 이벤트 라우팅 체계를 지원할 수 있습니다. 대부분의 입력 이벤트에는 연결된 이벤트 쌍이 있습니다 예를 들어 키 누름 이벤트에는 KeyDownPreviewKeyDown 이벤트가 연결되어 있습니다. 이벤트마다 이벤트가 대상 요소로 라우팅되는 방법이 다릅니다. 미리 보기 이벤트는 요소 트리의 루트 요소에서 대상 요소로 터널링됩니다. 버블링 이벤트는 대상 요소에서 루트 요소로 버블링됩니다. WPF의 이벤트 라우팅에 대한 자세한 내용은 본 개요 항목의 이후 단원 및 라우트된 이벤트 개요에서 자세히 설명합니다.

키보드 및 마우스 클래스

기본 요소 클래스의 입력 API 외에도 Keyboard 클래스와 Mouse 클래스는 키보드 및 마우스 입력을 처리하기 위해 추가 API를 제공합니다.

Keyboard 클래스의 입력 API의 예로는 현재 누른 ModifierKeys를 반환하는 Modifiers 속성과 지정된 키가 눌려 있는지 여부를 확인하는 IsKeyDown 메서드가 있습니다.

다음 예제에서는 GetKeyStates 메서드를 사용하여 Key가 눌려 있는지 여부를 확인합니다.

// Uses the Keyboard.GetKeyStates to determine if a key is down.
// A bitwise AND operation is used in the comparison. 
// e is an instance of KeyEventArgs.
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
    btnNone.Background = Brushes.Red;
}

Mouse 클래스의 입력 API의 예로는 마우스 가운데 단추의 상태를 가져오는 MiddleButton과 마우스 포인터가 현재 가리키고 있는 요소를 가져오는 DirectlyOver가 있습니다.

다음 예제에서는 마우스의 LeftButtonPressed 상태인지 여부를 확인합니다.

if (Mouse.LeftButton == MouseButtonState.Pressed)
{
    UpdateSampleResults("Left Button Pressed");
}

MouseKeyboard 클래스에 대해서는 본 개요 항목에서 자세히 다룹니다.

스타일러스 입력

WPF에는 Stylus에 대한 지원이 통합되어 있습니다. Stylus는 Tablet PC에 널리 사용되는 펜 입력 방법입니다. WPF 응용 프로그램은 마우스 API를 사용하여 스타일러스를 마우스로 처리할 수 있지만 WPF는 키보드 및 마우스와 비슷한 모델을 사용하는 스타일러스 장치 추상화도 제공합니다. 스타일러스와 관련된 모든 API에는 "Stylus"라는 단어가 포함됩니다.

스타일러스는 마우스처럼 동작할 수 있으므로 마우스 입력만 지원하는 응용 프로그램도 약간의 스타일러스 지원을 자동으로 받을 수 있습니다. 이러한 방식으로 스타일러스를 사용하는 경우 응용 프로그램은 알맞은 스타일러스 이벤트를 처리한 다음 해당 마우스 이벤트를 처리할 수 있게 됩니다. 뿐만 아니라 스타일러스 장치 추상화를 통해 잉크 입력과 같은 높은 수준의 서비스도 사용할 수 있습니다. 잉크 입력에 대한 자세한 내용은 잉크 시작을 참조하십시오.

이벤트 라우팅

FrameworkElement는 다른 요소를 해당 콘텐츠 모델에 자식 요소로 포함하여 요소 트리를 형성할 수 있습니다. WPF에서 부모 요소는 이벤트를 처리하여 해당 자식 요소 또는 다른 하위 요소를 대상으로 하는 입력에 참가할 수 있습니다. 이는 특히 더 작은 컨트롤에서 컨트롤을 만드는 "컨트롤 컴퍼지션" 또는 "합성"이라고 하는 프로세스에 유용합니다. 요소 트리 및 요소 트리와 이벤트 경로가 서로 어떻게 관련되는지에 대한 자세한 내용은 WPF의 트리를 참조하십시오.

이벤트 라우팅은 이벤트를 여러 요소로 전달함으로써 경로 상의 특정 개체나 요소가 다른 요소에서 발생시킨 이벤트에 대해 이벤트 처리를 통해 의미 있는 응답을 제공할 수 있도록 하는 프로세스입니다. 라우트된 이벤트는 직접, 버블링, 터널링이라는 세 가지 라우팅 메커니즘 중 하나를 사용합니다. 직접 라우팅에서는 소스 요소만 이벤트에 대한 알림을 받으며 이벤트가 다른 요소로 라우팅되지 않습니다. 하지만 직접 라우트된 이벤트도 표준 CLR 이벤트와는 달리 라우트된 이벤트에만 있는 몇몇 추가 기능을 제공합니다. 버블링은 먼저 이벤트에 대해 이벤트를 발생시킨 요소에 알린 다음 부모 요소 등에 알리는 순서로 요소 트리의 위쪽으로 작동합니다. 터널링은 요소 트리의 루트에서 시작하여 아래로 이동한 다음 원래 소스 요소에서 끝납니다. 라우트된 이벤트에 대한 자세한 내용은 라우트된 이벤트 개요를 참조하십시오.

WPF 입력 이벤트는 일반적으로 터널링 이벤트와 버블링 이벤트의 쌍으로 구성되어 제공됩니다. 터널링 이벤트는 "Preview" 접두사가 있다는 점에서 버블링 이벤트와 다릅니다. 예를 들어 PreviewMouseMove는 마우스 이동 이벤트의 터널링 버전이고 MouseMove는 이 이벤트의 버블링 버전입니다. 이 이벤트 쌍은 일반적으로 요소 수준에서 구현되며 WPF 이벤트 시스템의 본질적인 기능은 아닙니다. 자세한 내용은 라우트된 이벤트 개요의 WPF 입력 이벤트 단원을 참조하십시오.

입력 이벤트 처리

요소에서 입력을 받으려면 특정 이벤트에 이벤트 처리기를 연결해야 합니다. XAML에서는 이 작업이 매우 간단합니다. 이벤트를 수신할 요소의 특성으로 이벤트 이름을 참조합니다. 그런 다음 대리자에 따라 정의하는 이벤트 처리기의 이름으로 특성 값을 설정하기만 하면 됩니다. 이벤트 처리기는 C#과 같은 코드로 작성해야 하며 코드 숨김 파일에 포함할 수 있습니다.

키보드 이벤트는 키보드 포커스가 요소에 있는 동안 발생하는 키 동작을 운영 체제에서 보고할 때 발생합니다. 마우스 및 스타일러스 이벤트는 각각 요소를 기준으로 포인터 위치의 변경을 보고하는 이벤트와 장치 단추의 상태 변경을 보고하는 이벤트의 두 범주로 나뉩니다.

키보드 입력 이벤트 예제

다음 예제에서는 왼쪽 화살표 키 누르기를 수신합니다. Button이 있는 StackPanel을 만듭니다. 왼쪽 화살표 키 누르기를 수신할 이벤트 처리기를 Button 인스턴스에 연결합니다.

예제의 첫 번째 섹션에서는 StackPanelButton을 만든 다음 KeyDown에 대한 이벤트 처리기를 연결합니다.

<StackPanel>
  <Button Background="AliceBlue"
          KeyDown="OnButtonKeyDown"
          Content="Button1"/>
</StackPanel>
// Create the UI elements.
StackPanel keyboardStackPanel = new StackPanel();
Button keyboardButton1 = new Button();

// Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue;
keyboardButton1.Content = "Button 1";

// Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1);

// Attach event handler.
keyboardButton1.KeyDown += new KeyEventHandler(OnButtonKeyDown);

코드로 작성된 두 번째 섹션은 이벤트 처리기를 정의합니다. 왼쪽 화살표 키를 누르면 Button이 키보드 포커스를 가지고 처리기가 실행되어 ButtonBackground 색이 변경됩니다. 왼쪽 화살표 키가 아닌 다른 키를 누르면 ButtonBackground 색이 다시 시작 색으로 변경됩니다.

private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
    Button source = e.Source as Button;
    if (source != null)
    {
        if (e.Key == Key.Left)
        {
            source.Background = Brushes.LemonChiffon;
        }
        else
        {
            source.Background = Brushes.AliceBlue;
        }
    }
}

마우스 입력 이벤트 예제

다음 예제에서는 마우스 포인터가 Button으로 들어가면 ButtonBackground 색이 변경됩니다. 마우스가 Button을 벗어나면 Background 색이 복원됩니다.

이 예제의 첫 번째 섹션에서는 StackPanelButton 컨트롤을 만든 다음 MouseEnterMouseLeave 이벤트에 대한 이벤트 처리기를 Button에 연결합니다.

<StackPanel>
  <Button Background="AliceBlue"
          MouseEnter="OnMouseExampleMouseEnter"
          MouseLeave="OnMosueExampleMouseLeave">Button

  </Button>
</StackPanel>
// Create the UI elements.
StackPanel mouseMoveStackPanel = new StackPanel();
Button mouseMoveButton = new Button();

// Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue;
mouseMoveButton.Content = "Button";

// Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton);

// Attach event handler.
mouseMoveButton.MouseEnter += new MouseEventHandler(OnMouseExampleMouseEnter);
mouseMoveButton.MouseLeave += new MouseEventHandler(OnMosueExampleMouseLeave);

예제에서 코드로 작성된 두 번째 섹션은 이벤트 처리기를 정의합니다. 마우스가 Button으로 들어가면 ButtonBackground 색이 SlateGray로 변경됩니다. 마우스가 Button을 벗어나면 ButtonBackground 색이 다시 AliceBlue로 변경됩니다.

private void OnMouseExampleMouseEnter(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.SlateGray;
    }
}
private void OnMosueExampleMouseLeave(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.AliceBlue;
    }
}

텍스트 입력

TextInput 이벤트를 사용하면 장치 독립적인 방법으로 텍스트 입력을 수신할 수 있습니다. 텍스트 입력에는 주로 키보드를 사용하지만 음성, 필기 및 기타 입력 장치를 통해서도 텍스트 입력을 생성할 수 있습니다.

키보드 입력을 사용하는 경우 WPF가 먼저 적절한 KeyDown/KeyUp 이벤트를 보냅니다. 해당 이벤트가 처리되지 않았으며 키가 방향 화살표 키 또는 기능 키와 같은 제어 키가 아니라 텍스트 키이면 TextInput 이벤트가 발생합니다. 여러 키 입력으로 텍스트 입력의 단일 문자가 생성될 수도 있고 단일 키 입력으로 여러 문자로 된 문자열이 생성될 수도 있으므로 KeyDown/KeyUpTextInput 이벤트 간에 단순한 일대일 매핑은 없습니다. 이는 특히 각 언어의 알파벳으로 수천 개의 가능한 문자를 생성하는 데 IME(입력기)를 사용하는 한국어, 중국어 및 일본어 등의 언어에서 더욱 그렇습니다.

WPF가 KeyUp/KeyDown 이벤트를 전송할 때 키 입력이 TextInput 이벤트의 일부가 될 수 있으면(예: Alt+S를 누른 경우) KeyKey.System으로 설정됩니다. 그러면 KeyDown 이벤트 처리기의 코드가 Key.System이 있는지 확인하고, 있는 경우 이후에 발생한 TextInput 이벤트에 대한 처리를 처리기에 위임합니다. 이 경우 TextCompositionEventArgs 인수의 다양한 속성을 사용하여 원래 키 입력을 확인할 수 있습니다. 마찬가지로 IME가 활성 상태이면 Key의 값이 Key.ImeProcessed이고 ImeProcessedKey는 원래 키 입력을 제공합니다.

다음 예제에서는 Click 이벤트에 대한 처리기와 KeyDown 이벤트에 대한 처리기를 정의합니다.

코드 또는 태그의 첫 번째 세그먼트에서는 사용자 인터페이스를 만듭니다.

<StackPanel KeyDown="OnTextInputKeyDown">
  <Button Click="OnTextInputButtonClick"
          Content="Open" />
  <TextBox> . . . </TextBox>
</StackPanel>
// Create the UI elements.
StackPanel textInputStackPanel = new StackPanel();
Button textInputeButton = new Button();
TextBox textInputTextBox = new TextBox();
textInputeButton.Content = "Open";

// Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton);
textInputStackPanel.Children.Add(textInputTextBox);

// Attach event handlers.
textInputStackPanel.KeyDown += new KeyEventHandler(OnTextInputKeyDown);
textInputeButton.Click += new RoutedEventHandler(OnTextInputButtonClick);

코드의 두 번째 세그먼트에는 이벤트 처리기가 포함되어 있습니다.

private void OnTextInputKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.O && Keyboard.Modifiers == ModifierKeys.Control)
    {
        handle();
        e.Handled = true;
    }
}

private void OnTextInputButtonClick(object sender, RoutedEventArgs e)
{
    handle();
    e.Handled = true;
} 

public void handle()
{
    MessageBox.Show("Pretend this opens a file");
}

입력 이벤트는 이벤트 경로의 위쪽으로 버블링하므로 StackPanel은 어떤 요소에 키보드 포커스가 있는지에 관계없이 입력을 받습니다. 먼저 TextBox 컨트롤이 알림을 받습니다. 그런 다음 TextBox가 입력을 처리하지 않은 경우에만 OnTextInputKeyDown 처리기가 호출됩니다. KeyDown 이벤트 대신 PreviewKeyDown 이벤트가 사용된 경우에는 OnTextInputKeyDown 처리기가 먼저 호출됩니다.

이 예제에서 처리 논리는 Ctrl+O에 대해 한 번, 그리고 단추의 클릭 이벤트에 대해 한 번으로 총 두 번 작성되었습니다. 입력 이벤트를 직접 처리하는 대신 명령을 사용하면 이를 간편하게 처리할 수 있습니다. 명령에 대해서는 본 개요 항목과 명령 개요에서 설명합니다.

포커스

WPF에는 포커스와 관련된 두 가지 주요 개념인 키보드 포커스와 논리적인 포커스가 있습니다.

키보드 포커스

키보드 포커스는 키보드 입력을 받고 있는 요소를 말합니다. 바탕 화면에서 하나의 요소만 키보드 포커스를 가질 수 있습니다. WPF에서 키보드 포커스를 갖는 요소에는 IsKeyboardFocused가 true로 설정됩니다. 정적 Keyboard 메서드 FocusedElement는 현재 키보드 포커스를 가진 요소를 반환합니다.

키보드 포커스는 탭을 사용하여 요소로 이동하거나 TextBox와 같은 특정 요소를 마우스로 클릭하여 얻을 수 있습니다. Keyboard 클래스에 Focus 메서드를 사용하여 프로그래밍 방식으로 키보드 포커스를 얻을 수도 있습니다. Focus는 지정된 요소에 키보드 포커스를 제공합니다. Focus가 반환하는 요소는 현재 키보드 포커스를 가진 요소입니다.

요소가 키보드 포커스를 가지려면 Focusable 속성과 IsVisible 속성이 true로 설정되어 있어야 합니다. Panel과 같은 일부 클래스는 Focusable이 기본적으로 false로 설정되어 있기 때문에 이러한 요소가 포커스를 갖도록 하려면 이 속성을 true로 설정해야 할 수 있습니다.

다음 예제에서는 Focus를 사용하여 Button에 키보드 포커스를 설정합니다. 응용 프로그램에서 초기 포커스를 두기에 가장 좋은 위치는 Loaded 이벤트 처리기입니다.

private void OnLoaded(object sender, RoutedEventArgs e)
{
    // Sets keyboard focus on the first Button in the sample.
    Keyboard.Focus(firstButton);
}

키보드 포커스에 대한 자세한 내용은 포커스 개요를 참조하십시오.

논리적인 포커스

논리적인 포커스는 포커스 범위 내의 FocusManager.FocusedElement를 말합니다. 응용 프로그램에서 여러 요소가 논리적인 포커스를 가질 수 있지만 특정 포커스 범위 내에서 하나의 요소만 논리적인 포커스를 가질 수 있습니다.

포커스 범위는 범위 내에서 FocusedElement를 추적하는 컨테이너 요소입니다. 포커스가 포커스 범위를 벗어나면 포커스를 가진 요소는 키보드 포커스를 잃지만 논리적인 포커스는 그대로 유지합니다. 포커스가 포커스 범위로 돌아오면 포커스를 가진 요소가 키보드 포커스를 갖습니다. 이렇게 하면 여러 포커스 범위 사이에서 키보드 포커스가 변경되더라도 포커스 범위 내에서 포커스를 가진 요소는 포커스가 다시 돌아올 때 포커스를 가진 상태로 유지됩니다.

XAML(Extensible Application Markup Language)에서 FocusManager의 연결된 속성 IsFocusScope를 true로 설정하거나 코드에서 SetIsFocusScope 메서드를 사용하여 이 연결된 속성을 설정하면 요소를 포커스 범위로 만들 수 있습니다.

다음 예제에서는 연결된 속성 IsFocusScope를 설정하여 StackPanel을 포커스 범위로 만듭니다.

<StackPanel Name="focusScope1" 
            FocusManager.IsFocusScope="True"
            Height="200" Width="200">
  <Button Name="button1" Height="50" Width="50"/>
  <Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);

WPF에서 기본적으로 포커스 범위인 클래스는 Window, Menu, ToolBarContextMenu입니다.

키보드 포커스를 가진 요소는 자신이 속한 포커스 범위에 대한 논리적인 포커스도 가지므로 Keyboard 클래스 또는 기본 클래스의 Focus 메서드를 사용하여 한 요소에 포커스를 설정하면 해당 요소에 키보드 포커스와 논리적인 포커스가 설정됩니다.

포커스 범위에서 포커스를 가진 요소를 확인하려면 GetFocusedElement를 사용합니다. 포커스 범위에서 포커스를 가진 요소를 변경하려면 SetFocusedElement를 사용합니다.

논리적인 포커스에 대한 자세한 내용은 포커스 개요를 참조하십시오.

마우스 위치

WPF 입력 API는 좌표 공간과 관련된 유용한 정보를 제공합니다. 예를 들어 좌표 (0,0)은 좌표의 왼쪽 위를 나타냅니다. 하지만 이 좌표가 트리에서 어떤 요소의 왼쪽 위를 나타내는지는 알 수 없습니다. 즉, 좌표가 나타내는 요소가 입력 대상인지, 이벤트 처리기를 연결한 요소인지 또는 다른 요소인지 알 수 없습니다. 이러한 혼동을 피하기 위해 WPF 입력 API에서 마우스로 좌표를 사용할 때는 참조 프레임을 지정해야 합니다. GetPosition 메서드는 지정된 요소를 기준으로 마우스 포인터의 좌표를 반환합니다.

마우스 캡처

마우스 장치에는 마우스 캡처라고 하는 모달 특성이 있습니다. 마우스 캡처는 끌어서 놓기 작업이 시작될 때 전환되는 입력 상태를 유지함으로써 마우스 포인터의 명목상 화면 위치와 관련된 다른 작업이 발생할 필요가 없도록 하기 위해 사용됩니다. 마우스를 끄는 동안 끌어서 놓기 작업을 중단하지 않고는 클릭할 수 없으므로 끌기 원점에서 마우스 캡처를 보유하는 동안에는 대부분의 마우스 이동 동작이 적절하지 않게 됩니다. 입력 시스템은 마우스 캡처 상태를 확인할 수 있는 API와 특정 요소에 마우스 캡처를 적용하거나 마우스 캡처 상태를 취소할 수 있는 API를 제공합니다. 끌어서 놓기 작업에 대한 자세한 내용은 끌어서 놓기 개요를 참조하십시오.

명령

명령을 사용하면 장치 입력에 비해 보다 의미적 수준에서 입력을 처리할 수 있습니다. 명령은 Cut, Copy, Paste 또는 Open과 같은 단순한 지시문입니다. 명령은 명령 논리를 중앙 집중화하는 데 유용합니다. 즉, 동일한 명령을 ToolBarMenu에서 또는 바로 가기 키를 통해 액세스할 수 있습니다. 또한 명령은 명령을 사용할 수 없을 때 컨트롤을 비활성화하는 메커니즘도 제공합니다.

RoutedCommandICommand에 대한 WPF 구현입니다. RoutedCommand를 실행하면 명령 대상에서 PreviewExecutedExecuted 이벤트가 발생하여 다른 입력과 마찬가지로 요소 트리를 터널링 및 버블링합니다. 명령 대상이 설정되어 있지 않으면 키보드 포커스를 가진 요소가 명령 대상이 됩니다. 명령을 수행하는 논리는 CommandBinding에 연결되어 있습니다. Executed 이벤트가 특정 명령에 대한 CommandBinding에 도달하면 CommandBinding에서 ExecutedRoutedEventHandler가 호출됩니다. 이 처리기는 명령의 작업을 수행합니다.

명령에 대한 자세한 내용은 명령 개요를 참조하십시오.

WPF는 ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommandsEditingCommands로 구성된 일반 명령 라이브러리를 제공합니다. 또는 자체적으로 명령 라이브러리를 정의할 수도 있습니다.

다음 예제에서는 클릭할 경우 TextBox에서 Paste 명령을 호출하도록 MenuItem을 설정하는 방법을 보여 줍니다. 이 예제에서는 TextBox에 키보드 포커스가 있다고 가정합니다.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();

// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);

// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;

WPF의 명령에 대한 자세한 내용은 명령 개요를 참조하십시오.

입력 시스템 및 기본 요소

Mouse, KeyboardStylus 클래스가 정의하는 연결된 이벤트와 같은 입력 이벤트는 입력 시스템에 의해 발생하며 런타임에 시각적 트리에 대한 적중 테스트를 기반으로 개체 모델의 특정 위치에 삽입됩니다.

Mouse, KeyboardStylus가 연결된 이벤트로 정의하는 각 이벤트는 기본 요소 클래스인 UIElementContentElement가 새로운 라우트된 이벤트로 다시 노출합니다. 기본 요소의 라우트된 이벤트는 원래 연결된 이벤트를 처리하고 이벤트 데이터를 다시 사용하는 클래스를 통해 생성됩니다.

입력 이벤트가 해당 기본 요소 입력 이벤트 구현을 통해 특정 소스 요소와 연결되는 경우 이 입력 이벤트는 논리적 트리 개체 및 시각적 트리 개체의 조합에 기반을 둔 이벤트 경로의 나머지 부분을 이동할 수 있으며 응용 프로그램 코드에서 처리할 수 있습니다. 이러한 장치 관련 입력 이벤트의 경우 XAML과 코드 모두에서 보다 이해하기 쉬운 이벤트 처리기 구문을 사용할 수 있으므로 일반적으로 UIElementContentElement에서 라우트된 이벤트를 사용하여 처리하는 것이 더 편리합니다. 대신 프로세스를 시작한 연결된 이벤트를 처리할 수도 있지만 이 경우 몇 가지 문제에 직면할 수 있습니다. 예를 들어 기본 요소 클래스 처리를 통해 연결된 이벤트가 처리된 것으로 표시될 수 있습니다. 또한 연결된 이벤트에 대한 처리기를 연결하기 위해 실제 이벤트 구문 대신 접근자 메서드를 사용해야 합니다.

새로운 기능

이제 보다 다양한 방법으로 WPF에서 입력을 처리할 수 있게 되었습니다. 따라서 WPF에서 사용하는 라우트된 이벤트 메커니즘 및 다양한 형식의 입력 이벤트에 대해 보다 잘 이해하고 있어야 합니다.

WPF 프레임워크 요소 및 이벤트 라우팅에 대해 보다 자세히 설명하는 추가 리소스가 있습니다. 자세한 내용은 명령 개요, 포커스 개요기본 요소 개요WPF의 트리라우트된 이벤트 개요와 같은 개요를 참조하십시오.

참고 항목

개념

포커스 개요

명령 개요

라우트된 이벤트 개요

기본 요소 개요

기타 리소스

속성