입력 개요Input Overview

하위 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 시스템은 마우스, 키보드, 터치 및 스타일러스를 비롯 한 다양 한 장치에서 입력을 얻기 위한 강력한 API를 제공 합니다.The WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) subsystem provides a powerful API for obtaining input from a variety of devices, including the mouse, keyboard, touch, and stylus. 이 항목에서는 WPFWPF가 제공하는 서비스에 대해 설명하고 입력 시스템의 아키텍처를 살펴봅니다.This topic describes the services provided by WPFWPF and explains the architecture of the input systems.

입력 APIInput API

기본 입력 API 노출은 기본 UIElement요소 클래스인 FrameworkElement, ContentElement, 및 FrameworkContentElement에 있습니다.The primary input API exposure is found on the base element classes: UIElement, ContentElement, FrameworkElement, and FrameworkContentElement. 기본 요소에 대한 자세한 내용은 기본 요소 개요를 참조하세요.For more information about the base elements, see Base Elements Overview. 이러한 클래스는 키 누르기, 마우스 단추, 마우스 휠, 마우스 이동, 포커스 관리, 마우스 캡처 등과 관련된 입력 이벤트를 위한 기능을 제공합니다.These classes provide functionality for input events related to key presses, mouse buttons, mouse wheel, mouse movement, focus management, and mouse capture, to name a few. 입력 아키텍처는 모든 입력 이벤트를 서비스로 처리 하는 대신 기본 요소에 배치 하 여 입력 이벤트를 UI의 특정 개체에서 소싱 하 고 둘 이상의 요소에 opp가 있는 이벤트 라우팅 체계를 지원할 수 있도록 합니다. 입력 이벤트를 처리할 수 있습니다.By placing the input API on the base elements, rather than treating all input events as a service, the input architecture enables the input events to be sourced by a particular object in the UI, and to support an event routing scheme whereby more than one element has an opportunity to handle an input event. 대부분의 입력 이벤트에는 연결된 이벤트 쌍이 있습니다.Many input events have a pair of events associated with them. 예를 들어 key down 이벤트는 KeyDownPreviewKeyDown 이벤트와 연결 됩니다.For example, the key down event is associated with the KeyDown and PreviewKeyDown events. 이벤트마다 이벤트가 대상 요소로 라우트되는 방법이 다릅니다.The difference in these events is in how they are routed to the target element. 미리 보기 이벤트는 요소 트리의 루트 요소에서 대상 요소로 터널링됩니다.Preview events tunnel down the element tree from the root element to the target element. 버블링 이벤트는 대상 요소에서 루트 요소로 버블링됩니다.Bubbling events bubble up from the target element to the root element. WPFWPF의 이벤트 라우팅에 대한 자세한 내용은 이 개요 항목의 이후 단원 및 라우트된 이벤트 개요에서 자세히 설명합니다.Event routing in WPFWPF is discussed in more detail later in this overview and in the Routed Events Overview.

키보드 및 마우스 클래스Keyboard and Mouse Classes

기본 요소 클래스의 입력 api 외에도 클래스와 Keyboard Mouse 클래스는 키보드 및 마우스 입력을 사용 하기 위한 추가 api를 제공 합니다.In addition to the input API on the base element classes, the Keyboard class and Mouse classes provide additional API for working with keyboard and mouse input.

Keyboard 클래스에 대 한 입력 API의 예로는 Modifiers ModifierKeys 현재 누른을 IsKeyDown 반환 하는 속성과 지정 된 키를 눌렀는지 여부를 결정 하는 메서드가 있습니다.Examples of input API on the Keyboard class are the Modifiers property, which returns the ModifierKeys currently pressed, and the IsKeyDown method, which determines whether a specified key is pressed.

다음 예제에서는 GetKeyStates 메서드를 사용 하 여 Key 이 다운 상태 인지 여부를 확인 합니다.The following example uses the GetKeyStates method to determine if a Key is in the down state.

// 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;
}
' 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) And KeyStates.Down) > 0 Then
    btnNone.Background = Brushes.Red

Mouse DirectlyOver클래스의 입력 API 예는 마우스 가운데 단추의 상태를 가져오는 이며 마우스 포인터가 현재 있는 요소를 가져오는입니다. MiddleButtonExamples of input API on the Mouse class are MiddleButton, which obtains the state of the middle mouse button, and DirectlyOver, which gets the element the mouse pointer is currently over.

다음 예에서는 마우스 LeftButton 의가 Pressed 상태에 있는지 여부를 확인 합니다.The following example determines whether the LeftButton on the mouse is in the Pressed state.

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

이 개요 Keyboard 전체에서 및클래스에대해자세히설명합니다.MouseThe Mouse and Keyboard classes are covered in more detail throughout this overview.

스타일러스 입력Stylus Input

WPFWPF에는 Stylus에 대 한 통합 지원이 있습니다.has integrated support for the Stylus. 는에서 인기 Tablet PCTablet PC있는 펜 입력 입니다.StylusThe Stylus is a pen input made popular by the Tablet PCTablet PC. WPFWPF응용 프로그램은 마우스 API를 사용 하 여 스타일러스를 마우스로 처리할 수 있지만 WPFWPF 키보드 및 마우스와 유사한 모델을 사용 하는 스타일러스 장치 추상화도 노출 합니다.applications can treat the stylus as a mouse by using the mouse API, but WPFWPF also exposes a stylus device abstraction that use a model similar to the keyboard and mouse. 모든 스타일러스 관련 Api는 "스타일러스" 라는 단어를 포함 합니다.All stylus-related APIs contain the word "Stylus".

스타일러스는 마우스처럼 동작할 수 있으므로 마우스 입력만 지원하는 애플리케이션도 약간의 스타일러스 지원을 자동으로 받을 수 있습니다.Because the stylus can act as a mouse, applications that support only mouse input can still obtain some level of stylus support automatically. 이러한 방식으로 스타일러스를 사용하는 경우 애플리케이션은 알맞은 스타일러스 이벤트를 처리한 다음 해당 마우스 이벤트를 처리할 수 있게 됩니다.When the stylus is used in such a manner, the application is given the opportunity to handle the appropriate stylus event and then handles the corresponding mouse event. 뿐만 아니라 스타일러스 디바이스 추상화를 통해 잉크 입력과 같은 높은 수준의 서비스도 사용할 수 있습니다.In addition, higher-level services such as ink input are also available through the stylus device abstraction. 잉크 입력에 대한 자세한 내용은 잉크 시작을 참조하세요.For more information about ink as input, see Getting Started with Ink.

이벤트 라우팅Event Routing

FrameworkElement 다른 요소를 콘텐츠 모델의 자식 요소로 포함 하 여 요소의 트리를 형성할 수 있습니다.A FrameworkElement can contain other elements as child elements in its content model, forming a tree of elements. WPFWPF에서 부모 요소는 이벤트를 처리하여 해당 자식 요소 또는 다른 하위 요소를 대상으로 하는 입력에 참가할 수 있습니다.In WPFWPF, the parent element can participate in input directed to its child elements or other descendants by handing events. 이는 특히 더 작은 컨트롤에서 컨트롤을 빌드하는 “컨트롤 컴퍼지션” 또는 “합치기”라고 하는 프로세스에 유용합니다.This is especially useful for building controls out of smaller controls, a process known as "control composition" or "compositing." 요소 트리 및 요소 트리와 이벤트 경로가 서로 어떻게 관련되는지에 대한 자세한 내용은 WPF의 트리를 참조하세요.For more information about element trees and how element trees relate to event routes, see Trees in WPF.

이벤트 라우팅은 이벤트를 여러 요소로 전달함으로써 경로 상의 특정 개체나 요소가 다른 요소에서 발생시킨 이벤트에 대해 이벤트 처리를 통해 의미 있는 응답을 제공할 수 있도록 하는 프로세스입니다.Event routing is the process of forwarding events to multiple elements, so that a particular object or element along the route can choose to offer a significant response (through handling) to an event that might have been sourced by a different element. 라우트된 이벤트는 직접, 버블링, 터널링이라는 세 가지 라우팅 메커니즘 중 하나를 사용합니다.Routed events use one of three routing mechanisms: direct, bubbling, and tunneling. 직접 라우팅에서는 소스 요소만 이벤트에 대한 알림을 받으며 이벤트가 다른 요소로 라우트되지 않습니다.In direct routing, the source element is the only element notified, and the event is not routed to any other elements. 그러나 직접 라우트된 이벤트는 표준 CLR 이벤트와는 달리 라우트된 이벤트에 대해서만 제공 되는 몇 가지 추가 기능을 제공 합니다.However, the direct routed event still offers some additional capabilities that are only present for routed events as opposed to standard CLR events. 버블링은 먼저 이벤트에 대해 이벤트를 발생시킨 요소에 알린 다음 부모 요소 등에 알리는 순서로 요소 트리의 위쪽으로 작동합니다.Bubbling works up the element tree by first notifying the element that sourced the event, then the parent element, and so on. 터널링은 요소 트리의 루트에서 시작하여 아래로 이동한 다음 원래 소스 요소에서 끝납니다.Tunneling starts at the root of the element tree and works down, ending with the original source element. 라우트된 이벤트에 대한 자세한 내용은 라우트된 이벤트 개요를 참조하세요.For more information about routed events, see Routed Events Overview.

WPFWPF 입력 이벤트는 일반적으로 터널링 이벤트와 버블링 이벤트의 쌍으로 구성되어 제공됩니다.input events generally come in pairs that consists of a tunneling event and a bubbling event. 터널링 이벤트는 “Preview” 접두사가 있다는 점에서 버블링 이벤트와 다릅니다.Tunneling events are distinguished from bubbling events with the "Preview" prefix. 예를 들어 PreviewMouseMove 는 마우스 이동 이벤트의 터널링 버전 이며 MouseMove 이 이벤트의 버블링 버전입니다.For instance, PreviewMouseMove is the tunneling version of a mouse move event and MouseMove is the bubbling version of this event. 이 이벤트 쌍은 요소 수준에서 구현되는 규칙이며 WPFWPF 이벤트 시스템의 본질적인 기능은 아닙니다.This event pairing is a convention that is implemented at the element level and is not an inherent capability of the WPFWPF event system. 자세한 내용은 라우트된 이벤트 개요의 WPF 입력 이벤트 섹션을 참조하세요.For details, see the WPF Input Events section in Routed Events Overview.

입력 이벤트 처리Handling Input Events

요소에서 입력을 받으려면 특정 이벤트에 이벤트 처리기를 연결해야 합니다.To receive input on an element, an event handler must be associated with that particular event. XAMLXAML에서는 이 작업이 매우 간단합니다. 이 이벤트를 수신할 요소의 특성으로 이벤트 이름을 참조합니다.In XAMLXAML this is straightforward: you reference the name of the event as an attribute of the element that will be listening for this event. 그런 다음 대리자에 따라 정의하는 이벤트 처리기의 이름으로 특성 값을 설정하기만 하면 됩니다.Then, you set the value of the attribute to the name of the event handler that you define, based on a delegate. 이벤트 처리기는와 C# 같은 코드에 작성 해야 하며 코드 숨김이 포함 된 파일에 포함 될 수 있습니다.The event handler must be written in code such as C# and can be included in a code-behind file.

키보드 이벤트는 키보드 포커스가 요소에 있는 동안 발생하는 키 동작을 운영 체제에서 보고할 때 발생합니다.Keyboard events occur when the operating system reports key actions that occur while keyboard focus is on an element. 마우스 및 스타일러스 이벤트는 각각 요소를 기준으로 포인터 위치의 변경을 보고하는 이벤트와 디바이스 단추의 상태 변경을 보고하는 이벤트의 두 범주로 나뉩니다.Mouse and stylus events each fall into two categories: events that report changes in pointer position relative to the element, and events that report changes in the state of device buttons.

키보드 입력 이벤트 예제Keyboard Input Event Example

다음 예제에서는 왼쪽 화살표 키 누르기를 수신합니다.The following example listens for a left arrow key press. 이 있는가 만들어집니다 Button. StackPanelA StackPanel is created that has a Button. 왼쪽 화살표 키 누름을 수신 대기 하는 이벤트 처리기가 Button 인스턴스에 연결 됩니다.An event handler to listen for the left arrow key press is attached to the Button instance.

예제의 첫 번째 섹션에서는 StackPanel Button 및을 만들고에 대 한 KeyDown이벤트 처리기를 연결 합니다.The first section of the example creates the StackPanel and the Button and attaches the event handler for the 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);
' Create the UI elements.
Dim keyboardStackPanel As New StackPanel()
Dim keyboardButton1 As 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.
AddHandler keyboardButton1.KeyDown, AddressOf OnButtonKeyDown

코드로 작성된 두 번째 섹션은 이벤트 처리기를 정의합니다.The second section is written in code and defines the event handler. 왼쪽 화살표 키를 누르면에 Button 키보드 포커스가 있으면 처리기가 실행 ButtonBackground 고의 색이 변경 됩니다.When the left arrow key is pressed and the Button has keyboard focus, the handler runs and the Background color of the Button is changed. 키를 누른 채 왼쪽 화살표 키 Background 가 아닌 경우 Button 의 색은 다시 시작 색으로 변경 됩니다.If the key is pressed, but it is not the left arrow key, the Background color of the Button is changed back to its starting color.

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;
        }
    }
}
Private Sub OnButtonKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    Dim source As Button = TryCast(e.Source, Button)
    If source IsNot Nothing Then
        If e.Key = Key.Left Then
            source.Background = Brushes.LemonChiffon
        Else
            source.Background = Brushes.AliceBlue
        End If
    End If
End Sub

마우스 입력 이벤트 예제Mouse Input Event Example

다음 예제 Background 에서는 마우스 포인터가로 들어가면 Button Button의 색이 변경 됩니다.In the following example, the Background color of a Button is changed when the mouse pointer enters the Button. Background 색은 마우스가을 Button벗어날 때 복원 됩니다.The Background color is restored when the mouse leaves the Button.

예제의 첫 번째 StackPanel 섹션에서는 Button 및 컨트롤을 만들고 MouseEnterMouseLeave 이벤트 Button에 대 한 이벤트 처리기를에 연결 합니다.The first section of the example creates the StackPanel and the Button control and attaches the event handlers for the MouseEnter and MouseLeave events to the 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);
' Create the UI elements.
Dim mouseMoveStackPanel As New StackPanel()
Dim mouseMoveButton As New Button()

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

' Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton)

' Attach event handler.
AddHandler mouseMoveButton.MouseEnter, AddressOf OnMouseExampleMouseEnter
AddHandler mouseMoveButton.MouseLeave, AddressOf OnMosueExampleMouseLeave

예제에서 코드로 작성된 두 번째 섹션은 이벤트 처리기를 정의합니다.The second section of the example is written in code and defines the event handlers. 마우스가에 Button Button 들어가면의 SlateGray색이로 변경 됩니다. BackgroundWhen the mouse enters the Button, the Background color of the Button is changed to SlateGray. Button마우스로 벗어나면 Background 의 색 Button 이 로AliceBlue다시 변경 됩니다.When the mouse leaves the Button, the Background color of the Button is changed back to 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 Sub OnMouseExampleMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
    ' Cast the source of the event to a Button.
    Dim source As Button = TryCast(e.Source, Button)

    ' If source is a Button.
    If source IsNot Nothing Then
        source.Background = Brushes.SlateGray
    End If
End Sub
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;
    }
}
Private Sub OnMosueExampleMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
    ' Cast the source of the event to a Button.
    Dim source As Button = TryCast(e.Source, Button)

    ' If source is a Button.
    If source IsNot Nothing Then
        source.Background = Brushes.AliceBlue
    End If
End Sub

텍스트 입력Text Input

이벤트 TextInput 를 사용 하면 장치 독립적 방식으로 텍스트 입력을 수신할 수 있습니다.The TextInput event enables you to listen for text input in a device-independent manner. 텍스트 입력에는 주로 키보드를 사용하지만 음성, 필기 및 기타 입력 디바이스를 통해서도 텍스트 입력을 생성할 수 있습니다.The keyboard is the primary means of text input, but speech, handwriting, and other input devices can generate text input also.

키보드 입력의 경우 WPFWPF 는 먼저 적절 한 KeyDown / KeyUp 이벤트를 보냅니다.For keyboard input, WPFWPF first sends the appropriate KeyDown/KeyUp events. 이러한 이벤트가 처리 되지 않고 키가 방향 화살표 또는 기능 키 TextInput 와 같은 컨트롤 키가 아닌 텍스트 이면 이벤트가 발생 합니다.If those events are not handled and the key is textual (rather than a control key such as directional arrows or function keys), then a TextInput event is raised. 여러 키 입력에서 단일 텍스트 입력 문자를 생성할 수 있고 단일 KeyDownTextInput 입력이 여러 문자를 생성할 수 있기 때문에 및 이벤트 간에 / KeyUp 간단한 일대일 매핑이 항상 발생 하는 것은 아닙니다. 문자열일.There is not always a simple one-to-one mapping between KeyDown/KeyUp and TextInput events because multiple keystrokes can generate a single character of text input and single keystrokes can generate multi-character strings. 이는 Ime (입력기)를 사용 하 여 해당 하는 알파벳에서 수천 개의 문자를 생성 하는 중국어, 일본어, 한국어 등의 언어에서 특히 그렇습니다.This is especially true for languages such as Chinese, Japanese, and Korean which use Input Method Editors (IMEs) to generate the thousands of possible characters in their corresponding alphabets.

에서 WPFWPF KeyUp Key.System 이벤트를 보낼때/ 키 입력이 이벤트TextInput 의 일부가 될 수 있으면가로 설정 됩니다 (예: ALT + S를 누른 경우). KeyDown KeyWhen WPFWPF sends a KeyUp/KeyDown event, Key is set to Key.System if the keystrokes could become part of a TextInput event (if ALT+S is pressed, for example). 이를 통해 KeyDown 이벤트 처리기의 코드에서를 Key.System 확인 하 고, 검색 된 경우 이후에 발생 TextInput 한 이벤트 처리기에 대 한 처리를 유지할 수 있습니다.This allows code in a KeyDown event handler to check for Key.System and, if found, leave processing for the handler of the subsequently raised TextInput event. 이러한 경우 TextCompositionEventArgs 인수의 다양 한 속성을 사용 하 여 원래 키 입력을 확인할 수 있습니다.In these cases, the various properties of the TextCompositionEventArgs argument can be used to determine the original keystrokes. 마찬가지로 IME가 활성 Key 상태인 경우에는의 Key.ImeProcessed값이이 고 ImeProcessedKey 원래 키 입력 또는 키 입력을 제공 합니다.Similarly, if an IME is active, Key has the value of Key.ImeProcessed, and ImeProcessedKey gives the original keystroke or keystrokes.

다음 예제에서는 이벤트에 대 한 처리기 ClickKeyDown 이벤트에 대 한 처리기를 정의 합니다.The following example defines a handler for the Click event and a handler for the KeyDown event.

코드 또는 태그의 첫 번째 세그먼트에서는 사용자 인터페이스를 만듭니다.The first segment of code or markup creates the user interface.

<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);
' Create the UI elements.
Dim textInputStackPanel As New StackPanel()
Dim textInputeButton As New Button()
Dim textInputTextBox As New TextBox()
textInputeButton.Content = "Open"

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

' Attach event handlers.
AddHandler textInputStackPanel.KeyDown, AddressOf OnTextInputKeyDown
AddHandler textInputeButton.Click, AddressOf OnTextInputButtonClick

코드의 두 번째 세그먼트에는 이벤트 처리기가 포함되어 있습니다.The second segment of code contains the event handlers.

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");
}
Private Sub OnTextInputKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    If e.Key = Key.O AndAlso Keyboard.Modifiers = ModifierKeys.Control Then
        handle()
        e.Handled = True
    End If
End Sub

Private Sub OnTextInputButtonClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
    handle()
    e.Handled = True
End Sub

Public Sub handle()
    MessageBox.Show("Pretend this opens a file")
End Sub

입력 이벤트는 이벤트 경로를 버블링 하기 때문에 StackPanel 에서 키보드 포커스가 있는 요소에 관계 없이 입력을 받습니다.Because input events bubble up the event route, the StackPanel receives the input regardless of which element has keyboard focus. 컨트롤 TextBox 에는 먼저 알림이 표시 되 OnTextInputKeyDown 고가 입력을 처리 하지 TextBox 않은 경우에만 처리기가 호출 됩니다.The TextBox control is notified first and the OnTextInputKeyDown handler is called only if the TextBox did not handle the input. 이벤트 대신 PreviewKeyDown KeyDown 이벤트를 사용 하 OnTextInputKeyDown 는 경우 처리기가 먼저 호출 됩니다.If the PreviewKeyDown event is used instead of the KeyDown event, the OnTextInputKeyDown handler is called first.

이 예제에서 처리 논리는 Ctrl+O에 대해 한 번, 그리고 단추의 클릭 이벤트에 대해 한 번으로 총 두 번 작성되었습니다.In this example, the handling logic is written two times—one time for CTRL+O, and again for button's click event. 입력 이벤트를 직접 처리하는 대신 명령을 사용하면 이를 간편하게 처리할 수 있습니다.This can be simplified by using commands, instead of handling the input events directly. 명령에 대해서는 이 개요 항목과 명령 개요에서 설명합니다.Commands are discussed in this overview and in Commanding Overview.

터치 및 조작Touch and Manipulation

Windows 7 운영 체제의 새로운 하드웨어 및 API를 사용하면 애플리케이션이 여러 터치에서 동시에 입력을 수신할 수 있습니다.New hardware and API in the Windows 7 operating system provide applications the ability to receive input from multiple touches simultaneously. WPFWPF를 사용하면 응용 프로그램에서 터치가 발생할 때 이벤트를 발생시킴으로써 마우스나 키보드와 같은 다른 입력에 응답하는 것과 유사한 방식으로 터치를 감지하고 이에 응답할 수 있습니다.enables applications to detect and respond to touch in a manner similar to responding to other input, such as the mouse or keyboard, by raising events when touch occurs.

WPFWPF는 터치가 발생할 때 두 가지 형식의 이벤트, 즉 터치 이벤트와 조작 이벤트를 노출합니다.exposes two types of events when touch occurs: touch events and manipulation events. 터치 이벤트는 터치 스크린의 각 손가락과 그 이동에 대한 원시 데이터를 제공합니다.Touch events provide raw data about each finger on a touchscreen and its movement. 조작 이벤트는 특정 작업으로 입력을 해석합니다.Manipulation events interpret the input as certain actions. 이 섹션에서는 두 가지 형식의 이벤트에 대해 모두 설명합니다.Both types of events are discussed in this section.

전제 조건Prerequisites

터치에 응답하는 애플리케이션을 개발하려면 다음 구성 요소가 필요합니다.You need the following components to develop an application that responds to touch.

  • Visual Studio 2010Visual Studio 2010.

  • Windows 7Windows 7.

  • Windows Touch를 지원하는 터치 스크린과 같은 디바이스A device, such as a touchscreen, that supports Windows Touch.

용어Terminology

터치에 대해 설명할 때 다음 용어가 사용됩니다.The following terms are used when touch is discussed.

  • 터치는 Windows 7에서 인식되는 사용자 입력 형식입니다.Touch is a type of user input that is recognized by Windows 7. 일반적으로 터치 스크린에 손가락을 대면 터치가 시작됩니다.Usually, touch is initiated by putting fingers on a touch-sensitive screen. 랩톱 컴퓨터에서 일반적으로 사용되는 터치 패드와 같은 디바이스는 디바이스가 손가락의 위치와 움직임을 마우스 입력으로 단순히 변환하는 경우 터치를 지원하지 않습니다.Note that devices such as a touchpad that is common on laptop computers do not support touch if the device merely converts the finger's position and movement as mouse input.

  • 멀티 터치는 둘 이상의 지점에서 동시에 발생하는 터치입니다.Multitouch is touch that occurs from more than one point simultaneously. Windows 7 및 WPFWPF에서 멀티 터치를 지원합니다.Windows 7 and WPFWPF supports multitouch. WPFWPF에 대한 설명서에서 터치를 설명할 때마다 이 개념이 멀티 터치에 적용됩니다.Whenever touch is discussed in the documentation for WPFWPF, the concepts apply to multitouch.

  • 터치가 개체에 적용되는 물리적 액션으로 해석되면 조작이 발생합니다.A manipulation occurs when touch is interpreted as a physical action that is applied to an object. WPFWPF에서 조작 이벤트는 입력을 변환, 확장 또는 회전 조작으로 해석합니다.In WPFWPF, manipulation events interpret input as a translation, expansion, or rotation manipulation.

  • touch device는 터치 스크린에서 한 손가락과 같은 터치식 입력을 생성하는 장치를 나타냅니다.A touch device represents a device that produces touch input, such as a single finger on a touchscreen.

터치에 반응하는 컨트롤Controls that Respond to Touch

보기에서 스크롤된 콘텐츠가 있는 경우 컨트롤에서 손가락을 드래그하여 다음 컨트롤을 스크롤할 수 있습니다.The following controls can be scrolled by dragging a finger across the control if it has content that is scrolled out of view.

ScrollViewer ScrollViewer.PanningMode 연결 된 속성을 정의 합니다 .이 속성을 사용 하면 터치식 이동을 가로, 세로, 둘 다 또는 둘 다 사용 하지 않을 지 여부를 지정할 수 있습니다.The ScrollViewer defines the ScrollViewer.PanningMode attached property that enables you to specify whether touch panning is enabled horizontally, vertically, both, or neither. 속성 ScrollViewer.PanningDeceleration 은 사용자가 터치 스크린에서 손가락을 뗄 때 스크롤이 느려지는 속도를 지정 합니다.The ScrollViewer.PanningDeceleration property specifies how quickly the scrolling slows down when the user lifts the finger from the touchscreen. 연결 ScrollViewer.PanningRatio 된 속성은 조작 오프셋을 변환할 스크롤 오프셋의 비율을 지정 합니다.The ScrollViewer.PanningRatio attached property specifies the ratio of scrolling offset to translate manipulation offset.

터치 이벤트Touch Events

기본 클래스 UIElement UIElement3D,, 및 ContentElement는 응용 프로그램에서 터치에 응답할 수 있도록 구독할 수 있는 이벤트를 정의 합니다.The base classes, UIElement, UIElement3D, and ContentElement, define events that you can subscribe to so your application will respond to touch. 터치 이벤트는 애플리케이션이 터치를 개체 조작이 아닌 다른 것으로 해석할 때 유용합니다.Touch events are useful when your application interprets touch as something other than manipulating an object. 예를 들어 사용자가 하나 이상의 손가락으로 그릴 수 있는 애플리케이션은 터치 이벤트를 구독합니다.For example, an application that enables a user to draw with one or more fingers would subscribe to touch events.

세 클래스 모두 다음과 같은 이벤트를 정의합니다. 이 이벤트는 정의 클래스에 관계없이 유사하게 동작합니다.All three classes define the following events, which behave similarly, regardless of the defining class.

키보드 및 마우스 이벤트와 마찬가지로 터치 이벤트는 라우트된 이벤트입니다.Like keyboard and mouse events, the touch events are routed events. Preview로 시작하는 이벤트는 터널링 이벤트이고 Touch로 시작하는 이벤트는 버블링 이벤트입니다.The events that begin with Preview are tunneling events and the events that begin with Touch are bubbling events. 라우트된 이벤트에 대한 자세한 내용은 라우트된 이벤트 개요를 참조하세요.For more information about routed events, see Routed Events Overview. 이러한 이벤트를 처리 하는 경우 GetTouchPoint 또는 GetIntermediateTouchPoints 메서드를 호출 하 여 모든 요소를 기준으로 하는 입력의 위치를 가져올 수 있습니다.When you handle these events, you can get the position of the input, relative to any element, by calling the GetTouchPoint or GetIntermediateTouchPoints method.

터치 이벤트 간의 상호 작용을 이해하려면 사용자가 한 손가락을 요소 위에 놓고 손가락을 요소에서 움직인 다음 요소에서 손가락을 들어 올리는 시나리오를 고려해 보세요.To understand the interaction among the touch events, consider the scenario where a user puts one finger on an element, moves the finger in the element, and then lifts the finger from the element. 다음 그림에서는 버블링 이벤트를 실행하는 것을 보여 줍니다(단순하게 하기 위해 터널링 이벤트는 생략됨).The following illustration shows the execution of the bubbling events (the tunneling events are omitted for simplicity).

터치 이벤트의 시퀀스입니다. 터치 이벤트The sequence of touch events. Touch events

다음 목록은 앞의 그림에서 이벤트 시퀀스를 설명합니다.The following list describes the sequence of the events in the preceding illustration.

  1. TouchEnter 이벤트는 사용자가 요소에 손가락을 놓을 때 한 번 발생 합니다.The TouchEnter event occurs one time when the user puts a finger on the element.

  2. TouchDown 이벤트는 한 번 발생 합니다.The TouchDown event occurs one time.

  3. 사용자가 요소 내에서 손가락을 움직이면 이벤트가여러번발생합니다.TouchMoveThe TouchMove event occurs multiple times as the user moves the finger within the element.

  4. TouchUp 이벤트는 사용자가 요소에서 손가락을 뗄 때 한 번 발생 합니다.The TouchUp event occurs one time when the user lifts the finger from the element.

  5. TouchLeave 이벤트는 한 번 발생 합니다.The TouchLeave event occurs one time.

3개 이상의 손가락이 사용되면 각 손가락마다 이벤트가 발생합니다.When more than two fingers are used, the events occur for each finger.

조작 이벤트Manipulation Events

응용 프로그램에서 사용자가 개체를 조작할 수 있도록 하는 경우 클래스 UIElement 는 조작 이벤트를 정의 합니다.For cases where an application enables a user to manipulate an object, the UIElement class defines manipulation events. 터치 위치를 단순히 보고하는 터치 이벤트와 달리 조작 이벤트는 입력을 해석할 수 있는 방법을 보고합니다.Unlike the touch events that simply report the position of touch, the manipulation events report how the input can be interpreted. 변환, 확장 및 회전이라는 세 가지 형식의 조작이 있습니다.There are three types of manipulations, translation, expansion, and rotation. 다음 목록은 세 가지 형식의 조작을 호출하는 방법을 설명합니다.The following list describes how to invoke the three types of manipulations.

  • 개체에 손가락을 대고 터치 스크린에서 손가락을 움직이면 변환 조작을 호출합니다.Put a finger on an object and move the finger across the touchscreen to invoke a translation manipulation. 그러면 일반적으로 개체를 이동합니다.This usually moves the object.

  • 개체 위에 두 개의 손가락을 놓고 손가락을 서로 더 가깝게 또는 멀리 움직여 확장 조작을 호출합니다.Put two fingers on an object and move the fingers closer together or farther apart from one another to invoke an expansion manipulation. 그러면 일반적으로 개체의 크기를 조정합니다.This usually resizes the object.

  • 개체에 두 손가락을 놓고 손가락을 서로 회전하면 회전 조작을 호출합니다.Put two fingers on an object and rotate the fingers around each other to invoke a rotation manipulation. 그러면 일반적으로 개체를 회전합니다.This usually rotates the object.

둘 이상의 조작 형식이 동시에 발생할 수 있습니다.More than one type of manipulation can occur simultaneously.

개체가 조작에 응답하게 하면 개체에 관성이 있는 것처럼 보일 수 있습니다.When you cause objects to respond to manipulations, you can have the object appear to have inertia. 그러면 개체가 실제 세계를 시뮬레이트하게 만들 수 있습니다.This can make your objects simulate the physical world. 예를 들어 테이블에서 책을 밀 때 충분히 세게 밀면 책을 놓은 후에도 책이 계속 움직입니다.For example, when you push a book across a table, if you push hard enough the book will continue to move after you release it. WPFWPF을 사용하면 사용자가 손가락을 개체에서 뗀 후 조작 이벤트를 발생시켜 이 동작을 시뮬레이트할 수 있습니다.enables you to simulate this behavior by raising manipulation events after the user's fingers releases the object.

사용자가 개체 를 이동 하 고 크기를 조정 하 고 회전 하는 데 사용할 수 있는 응용 프로그램을 만드는 방법에 대 한 자세한 내용은 연습: 첫 번째 터치 응용 프로그램만들기For information about how to create an application that enables the user to move, resize, and rotate an object, see Walkthrough: Creating Your First Touch Application.

UIElement 다음과 같은 조작 이벤트를 정의 합니다.The UIElement defines the following manipulation events.

기본적으로는 UIElement 이러한 조작 이벤트를 수신 하지 않습니다.By default, a UIElement does not receive these manipulation events. 에서 UIElement조작 이벤트를 수신 하려면를로 UIElement.IsManipulationEnabled true설정 합니다.To receive manipulation events on a UIElement, set UIElement.IsManipulationEnabled to true.

조작 이벤트 실행 경로The Execution Path of Manipulation Events

사용자가 개체를 “throw”하는 시나리오를 고려해 보겠습니다.Consider a scenario where a user "throws" an object. 사용자가 개체 위에 손가락을 놓고 터치 스크린에서 짧은 거리만큼 손가락을 이동한 다음 개체가 움직이는 동안 손가락을 뗍니다.The user puts a finger on the object, moves the finger across the touchscreen for a short distance, and then lifts the finger while it is moving. 그 결과 사용자가 손가락을 뗀 후에도 개체가 사용자의 손가락 아래에서 계속 움직입니다.The result of this is that the object will move under the user's finger and continue to move after the user lifts the finger.

다음 그림에서는 조작 이벤트의 실행 경로 및 각 이벤트에 대한 중요한 정보를 보여 줍니다.The following illustration shows the execution path of manipulation events and important information about each event.

조작 이벤트의 시퀀스입니다. 조작 이벤트The sequence of manipulation events. Manipulation events

다음 목록은 앞의 그림에서 이벤트 시퀀스를 설명합니다.The following list describes the sequence of the events in the preceding illustration.

  1. ManipulationStarting 이벤트는 사용자가 개체에 손가락을 놓을 때 발생 합니다.The ManipulationStarting event occurs when the user places a finger on the object. 무엇 보다도이 이벤트를 통해 ManipulationContainer 속성을 설정할 수 있습니다.Among other things, this event allows you to set the ManipulationContainer property. 이후 이벤트에서 조작의 위치는에 상대적 ManipulationContainer입니다.In the subsequent events, the position of the manipulation will be relative to the ManipulationContainer. 이외의 ManipulationStarting이벤트에서이 속성은 읽기 전용 ManipulationStarting 이므로이 속성을 설정할 수 있는 유일한 시간은 이벤트입니다.In events other than ManipulationStarting, this property is read-only, so the ManipulationStarting event is the only time that you can set this property.

  2. ManipulationStarted 이벤트는 다음에 발생 합니다.The ManipulationStarted event occurs next. 이 이벤트는 조작의 출처를 보고합니다.This event reports the origin of the manipulation.

  3. 이벤트 ManipulationDelta 는 사용자가 터치 스크린에서 손가락을 움직일 때 여러 번 발생 합니다.The ManipulationDelta event occurs multiple times as a user's fingers move on a touchscreen. 클래스의 속성은 DeltaManipulation 조작이 이동, 확장 또는 변환으로 해석 되는지 여부를 보고 합니다. ManipulationDeltaEventArgsThe DeltaManipulation property of the ManipulationDeltaEventArgs class reports whether the manipulation is interpreted as movement, expansion, or translation. 바로 여기서 개체 조작 작업의 대부분이 수행됩니다.This is where you perform most of the work of manipulating an object.

  4. ManipulationInertiaStarting 이벤트는 사용자의 손가락이 개체와의 연결이 끊어질 때 발생 합니다.The ManipulationInertiaStarting event occurs when the user's fingers lose contact with the object. 이 이벤트를 사용하면 관성이 발생하는 동안 수행되는 조작의 감속을 지정할 수 있습니다.This event enables you to specify the deceleration of the manipulations during inertia. 따라서 사용자가 선택한 여러 가지 실제 공간 또는 특성을 개체가 에뮬레이트할 수 있습니다.This is so your object can emulate different physical spaces or attributes if you choose. 예를 들어 애플리케이션에 실제 세계의 항목을 나타내는 개체가 두 개 있고 한 개체가 다른 개체보다 무거운 경우를 가정해 봅니다.For example, suppose your application has two objects that represent items in the physical world, and one is heavier than the other. 이 경우 무거운 개체가 가벼운 개체보다 더 빠르게 감속되도록 할 수 있습니다.You can make the heavier object decelerate faster than the lighter object.

  5. ManipulationDelta 이벤트는 관성이 발생할 때 여러 번 발생 합니다.The ManipulationDelta event occurs multiple times as inertia occurs. 이 이벤트는 사용자가 터치 스크린에서 손가락을 이동하고 WPFWPF에서 관성을 시뮬레이트하는 경우에 발생합니다.Note that this event occurs when the user's fingers move across the touchscreen and when WPFWPF simulates inertia. 즉, ManipulationDeltaManipulationInertiaStarting 이벤트 전후에 발생 합니다.In other words, ManipulationDelta occurs before and after the ManipulationInertiaStarting event. 속성 ManipulationDeltaEventArgs.IsInertial 은 관성 중에 ManipulationDelta 이벤트가 발생 하는지 여부를 보고 하므로 해당 속성을 확인 하 고 해당 값에 따라 다른 작업을 수행할 수 있습니다.The ManipulationDeltaEventArgs.IsInertial property reports whether the ManipulationDelta event occurs during inertia, so you can check that property and perform different actions, depending on its value.

  6. ManipulationCompleted 이벤트는 조작과 모든 관성이 종료 될 때 발생 합니다.The ManipulationCompleted event occurs when the manipulation and any inertia ends. 즉, 모든 ManipulationDelta 이벤트가 발생 ManipulationCompleted 한 후 조작이 완료 되었음을 알리는 이벤트가 발생 합니다.That is, after all the ManipulationDelta events occur, the ManipulationCompleted event occurs to signal that the manipulation is complete.

또한 UIElement 는 이벤트를 ManipulationBoundaryFeedback 정의 합니다.The UIElement also defines the ManipulationBoundaryFeedback event. 이 이벤트는 ManipulationDelta 이벤트에서 ReportBoundaryFeedback 메서드가 호출 될 때 발생 합니다.This event occurs when the ReportBoundaryFeedback method is called in the ManipulationDelta event. ManipulationBoundaryFeedback 이벤트를 사용 하면 개체가 경계에 도달할 때 응용 프로그램 또는 구성 요소가 시각적 피드백을 제공할 수 있습니다.The ManipulationBoundaryFeedback event enables applications or components to provide visual feedback when an object hits a boundary. 예를 들어, Window 클래스는 해당 ManipulationBoundaryFeedback 가장자리가 나타날 때 창이 약간 이동 되도록 이벤트를 처리 합니다.For example, the Window class handles the ManipulationBoundaryFeedback event to cause the window to slightly move when its edge is encountered.

이벤트를 제외한 ManipulationBoundaryFeedback 모든 조작 이벤트의 이벤트 Cancel 인수에서 메서드를 호출 하 여 조작을 취소할 수 있습니다.You can cancel the manipulation by calling the Cancel method on the event arguments in any manipulation event except ManipulationBoundaryFeedback event. 를 호출 Cancel하면 조작 이벤트가 더 이상 발생 하지 않고 터치를 위해 마우스 이벤트가 발생 합니다.When you call Cancel, the manipulation events are no longer raised and mouse events occur for touch. 다음 표에서는 조작이 취소되는 시점과 발생하는 마우스 이벤트 간의 관계에 대해 설명합니다.The following table describes the relationship between the time the manipulation is canceled and the mouse events that occur.

Cancel이 호출되는 이벤트The event that Cancel is called in 이미 발생한 입력에 대해 발생하는 마우스 이벤트The mouse events that occur for input that already occurred
ManipulationStartingManipulationStartedManipulationStarting and ManipulationStarted 마우스 누름 이벤트Mouse down events.
ManipulationDelta 마우스 누름 및 마우스 이동 이벤트Mouse down and mouse move events.
ManipulationInertiaStartingManipulationCompletedManipulationInertiaStarting and ManipulationCompleted 마우스 누름, 마우스 이동 및 마우스 놓기 이벤트Mouse down, mouse move, and mouse up events.

조작이 관성에 있을 때 Cancel 를 호출 하는 경우 메서드는을 반환 false 하 고 입력은 마우스 이벤트를 발생 시 키 지 않습니다.Note that if you call Cancel when the manipulation is in inertia, the method returns false and the input does not raise mouse events.

터치 이벤트와 조작 이벤트의 관계The Relationship Between Touch and Manipulation Events

UIElement 항상 터치 이벤트를 받을 수 있습니다.A UIElement can always receive touch events. 속성이로 true설정 된 경우는 UIElement 터치 및 조작 이벤트를 모두 수신할 수 있습니다. IsManipulationEnabledWhen the IsManipulationEnabled property is set to true, a UIElement can receive both touch and manipulation events. 이벤트가 처리 되지 않은 경우 (즉 Handled , 속성이 인 false경우) 조작 논리는 요소에 터치를 캡처하고 조작 이벤트를 생성 합니다. TouchDownIf the TouchDown event is not handled (that is, the Handled property is false), the manipulation logic captures the touch to the element and generates the manipulation events. 이벤트에서TouchDown 속성이로 true 설정 된 경우 조작 논리는 조작 이벤트를 생성 하지 않습니다. HandledIf the Handled property is set to true in the TouchDown event, the manipulation logic does not generate manipulation events. 다음 그림에서는 터치 이벤트와 조작 이벤트의 관계를 보여 줍니다.The following illustration shows the relationship between touch events and manipulation events.

터치 이벤트와 조작 이벤트 간의 관계 터치 및 조작 이벤트Relationship between touch and manipulation events Touch and manipulation events

다음 목록에서는 앞의 그림에 나와 있는 터치 이벤트와 조작 이벤트의 관계에 대해 설명합니다.The following list describes the relationship between the touch and manipulation events that is shown in the preceding illustration.

포커스Focus

WPFWPF에는 포커스와 관련된 두 가지 주요 개념인 키보드 포커스와 논리 포커스가 있습니다.There are two main concepts that pertain to focus in WPFWPF: keyboard focus and logical focus.

키보드 포커스Keyboard Focus

키보드 포커스는 키보드 입력을 받고 있는 요소를 말합니다.Keyboard focus refers to the element that is receiving keyboard input. 키보드 포커스가 있는 전체 데스크탑에는 요소가 하나뿐이어야 합니다.There can be only one element on the whole desktop that has keyboard focus. 에서 WPFWPF키보드 포커스가 IsKeyboardFocused 있는 요소는을로 true설정 합니다.In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. 정적 Keyboard 메서드FocusedElement 는 현재 키보드 포커스가 있는 요소를 반환 합니다.The static Keyboard method FocusedElement returns the element that currently has keyboard focus.

키보드 포커스는 요소로 탭 이동 하거나 등의 특정 요소 TextBox에서 마우스를 클릭 하 여 가져올 수 있습니다.Keyboard focus can be obtained by tabbing to an element or by clicking the mouse on certain elements, such as a TextBox. 클래스의 메서드를 Focus 사용 하 여 프로그래밍 방식으로 키보드 포커스를 가져올 수도 있습니다. KeyboardKeyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Focus지정 된 요소에 키보드 포커스를 지정 하려고 시도 합니다.Focus attempts to give the specified element keyboard focus. 에서 Focus 반환 하는 요소는 현재 키보드 포커스가 있는 요소입니다.The element returned by Focus is the element that currently has keyboard focus.

요소가 키보드 포커스 Focusable 를 가져오도록 하려면 속성 IsVisible 및 속성을 true로 설정 해야 합니다.In order for an element to obtain keyboard focus the Focusable property and the IsVisible properties must be set to true. 등의 Panel일부 클래스는 기본적으로로 false 설정 되어 Focusable 있으므로 해당 요소에서 포커스를 얻을 수 있도록 하려면이 속성 true 을로 설정 해야 할 수 있습니다.Some classes, such as Panel, have Focusable set to false by default; therefore, you may have to set this property to true if you want that element to be able to obtain focus.

다음 예제에서는를 Focus 사용 하 여에 키보드 포커스 Button를 설정 합니다.The following example uses Focus to set keyboard focus on a Button. 응용 프로그램에서 초기 포커스를 설정 하는 데 권장 되는 Loaded 위치가 이벤트 처리기에 있습니다.The recommended place to set initial focus in an application is in the Loaded event handler.

private void OnLoaded(object sender, RoutedEventArgs e)
{
    // Sets keyboard focus on the first Button in the sample.
    Keyboard.Focus(firstButton);
}
Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
    ' Sets keyboard focus on the first Button in the sample.
    Keyboard.Focus(firstButton)
End Sub

키보드 포커스에 대한 자세한 내용은 포커스 개요를 참조하세요.For more information about keyboard focus, see Focus Overview.

논리 포커스Logical Focus

논리적 포커스는 포커스 범위 FocusManager.FocusedElement 에서을 참조 합니다.Logical focus refers to the FocusManager.FocusedElement in a focus scope. 애플리케이션에 논리 포커스가 있는 요소는 여러 개일 수 있지만, 특정 포커스 범위에 논리 포커스가 있는 요소는 하나뿐일 수 있습니다.There can be multiple elements that have logical focus in an application, but there may only be one element that has logical focus in a particular focus scope.

포커스 범위는 추적 하는 컨테이너 요소는 FocusedElement 해당 범위 내에서.A focus scope is a container element that keeps track of the FocusedElement within its scope. 포커스가 포커스 범위를 벗어나면 포커스가 있는 요소에서 키보드 포커스를 잃지만 논리 포커스는 유지합니다.When focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. 포커스가 포커스 범위로 돌아오면 포커스가 있는 요소가 키보드 포커스를 갖습니다.When focus returns to the focus scope, the focused element will obtain keyboard focus. 이렇게 하면 여러 포커스 범위 사이에서 키보드 포커스가 변경되더라도 포커스 범위 내에서 포커스가 있는 요소는 포커스가 다시 돌아올 때 포커스가 있는 상태로 유지됩니다.This allows for keyboard focus to be changed between multiple focus scopes but insures that the focused element within the focus scope remains the focused element when focus returns.

XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) FocusManager 에서 연결 된 속성 IsFocusScopeSetIsFocusScopetrue설정 하거나 메서드를 사용 하 여 연결 된 속성을 설정 하 여 코드에서 요소를 포커스 범위로 설정할 수 있습니다.An element can be turned into a focus scope in XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) by setting the FocusManager attached property IsFocusScope to true, or in code by setting the attached property by using the SetIsFocusScope method.

다음 예제에서는 IsFocusScope 연결 된 StackPanel 속성을 설정 하 여을 포커스 범위로 만듭니다.The following example makes a StackPanel into a focus scope by setting the IsFocusScope attached property.

<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);
Dim focuseScope2 As New StackPanel()
FocusManager.SetIsFocusScope(focuseScope2, True)

WPFWPF Menu ToolBar 기본적으로ContextMenu포커스 범위에 해당 하는 클래스는 ,,및입니다.WindowClasses in WPFWPF which are focus scopes by default are Window, Menu, ToolBar, and ContextMenu.

키보드 포커스가 있는 요소에는 자신이 속한 포커스 범위에 대 한 논리 포커스가 있습니다. 따라서 Keyboard 클래스 또는 기본 요소 클래스의 메서드를 Focus 사용 하 여 요소에 포커스를 설정 하면 요소에 키보드 포커스와 논리 포커스를 제공 하려고 합니다.An element that has keyboard focus will also have logical focus for the focus scope it belongs to; therefore, setting focus on an element with the Focus method on the Keyboard class or the base element classes will attempt to give the element keyboard focus and logical focus.

포커스 범위에서 포커스가 있는 요소를 확인 하려면를 사용 GetFocusedElement합니다.To determine the focused element in a focus scope, use GetFocusedElement. 포커스 범위에 대 한 포커스가 있는 요소를 변경 하려면 SetFocusedElement를 사용 합니다.To change the focused element for a focus scope, use SetFocusedElement.

논리 포커스에 대한 자세한 내용은 포커스 개요를 참조하세요.For more information about logical focus, see Focus Overview.

마우스 위치Mouse Position

입력 WPFWPF API는 좌표 공간에 관한 유용한 정보를 제공 합니다.The WPFWPF input API provides helpful information with regard to coordinate spaces. 예를 들어 좌표 (0,0)은 좌표의 왼쪽 위를 나타냅니다. 그러나 트리에서 어떤 요소의 왼쪽 위인가요?For example, coordinate (0,0) is the upper-left coordinate, but the upper-left of which element in the tree? 즉, 좌표가 나타내는 요소가 입력 대상인지The element that is the input target? 이벤트 처리기를 연결한 요소인지The element you attached your event handler to? 또는 다른 요소인지 알 수 없습니다.Or something else? 혼동을 피하기 위해 입력 WPFWPF API는 마우스를 통해 얻은 좌표를 사용할 때 참조 프레임을 지정 해야 합니다.To avoid confusion, the WPFWPF input API requires that you specify your frame of reference when you work with coordinates obtained through the mouse. 메서드 GetPosition 는 지정 된 요소를 기준으로 마우스 포인터의 좌표를 반환 합니다.The GetPosition method returns the coordinate of the mouse pointer relative to the specified element.

마우스 캡처Mouse Capture

마우스 디바이스에는 마우스 캡처라고 하는 모달 특성이 있습니다.Mouse devices specifically hold a modal characteristic known as mouse capture. 마우스 캡처는 끌어서 놓기 작업이 시작될 때 전환되는 입력 상태를 유지함으로써 마우스 포인터의 명목상 화면 위치와 관련된 다른 작업이 발생할 필요가 없도록 하기 위해 사용됩니다.Mouse capture is used to maintain a transitional input state when a drag-and-drop operation is started, so that other operations involving the nominal on-screen position of the mouse pointer do not necessarily occur. 마우스를 끄는 동안 끌어서 놓기 작업을 중단하지 않고는 클릭할 수 없으므로 끌기 원점에서 마우스 캡처를 보유하는 동안에는 대부분의 마우스 이동 동작이 적절하지 않게 됩니다.During the drag, the user cannot click without aborting the drag-and-drop, which makes most mouseover cues inappropriate while the mouse capture is held by the drag origin. 입력 시스템은 마우스 캡처 상태를 확인할 수 있는 Api 뿐만 아니라 특정 요소에 마우스 캡처를 적용 하거나 마우스 캡처 상태를 지울 수 있는 api를 노출 합니다.The input system exposes APIs that can determine mouse capture state, as well as APIs that can force mouse capture to a specific element, or clear mouse capture state. 끌어서 놓기 작업에 대한 자세한 내용은 끌어서 놓기 개요를 참조하세요.For more information on drag-and-drop operations, see Drag and Drop Overview.

명령Commands

명령을 사용하면 디바이스 입력에 비해 보다 의미적 수준에서 입력을 처리할 수 있습니다.Commands enable input handling at a more semantic level than device input. 명령은 Cut, Copy, Paste 또는 Open과 같은 단순한 지시문입니다.Commands are simple directives, such as Cut, Copy, Paste, or Open. 명령은 명령 논리를 중앙 집중화하는 데 유용합니다.Commands are useful for centralizing your command logic. 동일한 명령은에서 또는 바로 가기 키를 Menu통해 액세스할 ToolBar수 있습니다.The same command might be accessed from a Menu, on a ToolBar, or through a keyboard shortcut. 또한 명령은 명령을 사용할 수 없을 때 컨트롤을 비활성화하는 메커니즘도 제공합니다.Commands also provide a mechanism for disabling controls when the command becomes unavailable.

RoutedCommand는의 WPFWPF ICommand구현입니다.RoutedCommand is the WPFWPF implementation of ICommand. 가 실행 되 면 Executed 및 이벤트가 명령 대상에서 발생 하 고, 다른 입력과 마찬가지로 요소 트리를 통해 터널링 및 버블링 됩니다. PreviewExecuted RoutedCommandWhen a RoutedCommand is executed, a PreviewExecuted and an Executed event are raised on the command target, which tunnel and bubble through the element tree like other input. 명령 대상이 설정되어 있지 않으면 키보드 포커스가 있는 요소가 명령 대상이 됩니다.If a command target is not set, the element with keyboard focus will be the command target. 명령을 수행 하는 논리는에 연결 CommandBinding됩니다.The logic that performs the command is attached to a CommandBinding. CommandBinding 특정 명령 에ExecutedRoutedEventHandler 대 한 Executed 이벤트가에 도달 하면의 CommandBinding 가 호출 됩니다.When an Executed event reaches a CommandBinding for that specific command, the ExecutedRoutedEventHandler on the CommandBinding is called. 이 처리기는 명령의 작업을 수행합니다.This handler performs the action of the command.

명령에 대한 자세한 내용은 명령 개요를 참조하세요.For more information on commanding, see Commanding Overview.

WPFWPFApplicationCommands ,MediaCommands ,,EditingCommands및로 구성 된 일반적인 명령 라이브러리를 제공 하거나 사용자가 직접 정의할 수 있습니다. ComponentCommands NavigationCommandsprovides a library of common commands which consists of ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, and EditingCommands, or you can define your own.

다음 예제에서는를 클릭 하면에서 키보드 포커스가 MenuItem 있는 것 TextBox으로 가정 TextBox 하 여에 대 한 Paste 명령을 호출 하도록를 설정 하는 방법을 보여 줍니다.The following example shows how to set up a MenuItem so that when it is clicked it will invoke the Paste command on the TextBox, assuming the TextBox has keyboard focus.

<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;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As 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

WPFWPF에서 명령에 대한 자세한 내용은 명령 개요를 참조하세요.For more information about commands in WPFWPF, see Commanding Overview.

입력 시스템 및 기본 요소The Input System and Base Elements

Mouse ,Keyboard및 클래스Stylus 에 의해 정의 된 연결 된 이벤트와 같은 입력 이벤트는 입력 시스템에서 발생 하 고 런타임에 시각적 트리의 적중 테스트를 기반으로 개체 모델의 특정 위치에 삽입 됩니다.Input events such as the attached events defined by the Mouse, Keyboard, and Stylus classes are raised by the input system and injected into a particular position in the object model based on hit testing the visual tree at run time.

, MouseKeyboard UIElement ContentElement 가 연결 된 이벤트로 정의 하는 각 이벤트는 기본 요소 클래스 및 새로운 라우트된 이벤트로도 다시 노출 됩니다. StylusEach of the events that Mouse, Keyboard, and Stylus define as an attached event is also re-exposed by the base element classes UIElement and ContentElement as a new routed event. 기본 요소의 라우트된 이벤트는 원래 연결된 이벤트를 처리하고 이벤트 데이터를 다시 사용하는 클래스를 통해 생성됩니다.The base element routed events are generated by classes handling the original attached event and reusing the event data.

입력 이벤트가 해당 기본 요소 입력 이벤트 구현을 통해 특정 소스 요소와 연결되는 경우 이 입력 이벤트는 논리적 트리 개체 및 시각적 트리 개체의 조합을 기반으로 하는 이벤트 경로의 나머지 부분을 통해 전송할 수 있으며 애플리케이션 코드에서 처리할 수 있습니다.When the input event becomes associated with a particular source element through its base element input event implementation, it can be routed through the remainder of an event route that is based on a combination of logical and visual tree objects, and be handled by application code. 일반적으로 및 코드에서 보다 직관적인 UIElement XAMLXAML 이벤트 처리기 구문을 사용할 수 있기 때문에 및 ContentElement에서 라우트된 이벤트를 사용 하 여 이러한 장치 관련 입력 이벤트를 처리 하는 것이 더 편리 합니다.Generally, it is more convenient to handle these device-related input events using the routed events on UIElement and ContentElement, because you can use more intuitive event handler syntax both in XAMLXAML and in code. 대신 프로세스를 시작한 연결된 이벤트를 처리할 수도 있지만 이 경우 몇 가지 문제에 직면할 수 있습니다. 예를 들어 기본 요소 클래스 처리를 통해 연결된 이벤트가 처리된 것으로 표시될 수 있습니다. 또한 연결된 이벤트에 대한 처리기를 연결하기 위해 실제 이벤트 구문 대신 접근자 메서드를 사용해야 합니다.You could choose to handle the attached event that initiated the process instead, but you would face several issues: the attached event may be marked handled by the base element class handling, and you need to use accessor methods rather than true event syntax in order to attach handlers for attached events.

새로운 기능What's Next

이제 보다 다양한 기술로 WPFWPF에서 입력을 처리할 수 있게 되었습니다.You now have several techniques to handle input in WPFWPF. 따라서 WPFWPF에서 사용하는 라우트된 이벤트 메커니즘 및 다양한 형식의 입력 이벤트에 대해 보다 잘 이해하고 있어야 합니다.You should also have an improved understanding of the various types of input events and the routed event mechanisms used by WPFWPF.

WPFWPF 프레임워크 요소 및 이벤트 라우팅에 대해 보다 자세히 설명하는 추가 리소스가 있습니다.Additional resources are available that explain WPFWPF framework elements and event routing in more detail. 자세한 내용은 명령 개요, 포커스 개요, 기본 요소 개요,WPF의 트리라우트된 이벤트 개요와 같은 개요를 참조하세요.See the following overviews for more information, Commanding Overview, Focus Overview, Base Elements Overview, Trees in WPF, and Routed Events Overview.

참고자료See also