Общие сведения о входных данныхInput Overview

Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Подсистема предоставляет мощный APIAPI для получения входных данных из широкого спектра устройств, включая мышь, клавиатура, сенсорного ввода и пера.The Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) subsystem provides a powerful APIAPI 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.

API вводаInput API

Основные входные данные APIAPI находится в классах базовых элементов: UIElement, ContentElement, FrameworkElement, и FrameworkContentElement.The primary input APIAPI 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. Благодаря помещению APIAPI ввода в базовые элементы, вместо того чтобы рассматривать все события ввода как службу, архитектура ввода позволяет событиям ввода поступать от конкретного объекта в пользовательском интерфейсе и поддерживать схему маршрутизации событий, при которой более чем один элемент имеет возможность обрабатывать событие ввода.By placing the input APIAPI 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. Например, событие нажатия клавиши связан с KeyDown и PreviewKeyDown события.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 и MouseKeyboard and Mouse Classes

В дополнение к входные данные APIAPI в классах базовых элементов, Keyboard класс и Mouse классы предоставляют дополнительные APIAPI для работы с клавиатуру и мышь.In addition to the input APIAPI on the base element classes, the Keyboard class and Mouse classes provide additional APIAPI for working with keyboard and mouse input.

Примеры входных данных APIAPI на Keyboard класса Modifiers свойство, которое возвращает ModifierKeys в данный момент нажата и IsKeyDown метод, который определяет, нажата ли указанный ключ.Examples of input APIAPI 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

Примеры входных данных APIAPI на Mouse класса MiddleButton, который получает состояние средней кнопки мыши, и DirectlyOver, получающий указатель мыши на элемент наведен.Examples of input APIAPI 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

Mouse И Keyboard классы рассматриваются более подробно в этом обзоре.The Mouse and Keyboard classes are covered in more detail throughout this overview.

Ввод с помощью пераStylus Input

WPFWPF предусмотрена встроенная поддержка Stylus.has integrated support for the Stylus. Stylus — Рукописный ввод, ставший популярным благодаря Планшетный ПКTablet PC.The Stylus is a pen input made popular by the Планшетный ПКTablet PC. Приложения WPFWPF могут обрабатывать перо как мышь с помощью APIAPI мыши, но WPFWPF также предоставляет перо как абстрактное устройство, использующее модель, аналогичную клавиатуре и мыши.WPFWPF applications can treat the stylus as a mouse by using the mouse APIAPI, but WPFWPF also exposes a stylus device abstraction that use a model similar to the keyboard and mouse. Все связанные с пером API - интерфейсыAPIs содержат слово Stylus.All stylus-related API - интерфейсы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. Тем не менее событие с прямой маршрутизацией предоставляет некоторые дополнительные возможности, доступные только для перенаправленных событий, в отличие от стандартных событий CLRCLR.However, the direct routed event still offers some additional capabilities that are only present for routed events as opposed to standard CLRCLR 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 обычно представлены парами, состоящими из событий нисходящей и восходящей маршрутизации.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. Объект StackPanel создается, имеет Button.A 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 имеет фокус клавиатуры, запускается обработчик и Background цвет Button изменяется.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 управления и присоединяет обработчики событий для MouseEnter и MouseLeave событий 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, Background цвет Button изменяется на SlateGray.When 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. Не всегда существует простое однозначное сопоставление между KeyDown / KeyUp и TextInput события, так как несколькими нажатиями клавиш можно создать один символ для ввода текста и единственным нажатием клавиши можно создавать Многосимвольные строки.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)Input Method Editors (IMEs) для формирования тысяч возможных символов в соответствующем алфавите.This is especially true for languages such as Chinese, Japanese, and Korean which use Редакторы метода ввода (IME)Input Method Editors (IMEs) to generate the thousands of possible characters in their corresponding alphabets.

Когда WPFWPF отправляет KeyUp / KeyDown событий, Key присваивается Key.System если нажатие клавиш может стать частью TextInput событий (если ALT + S нажата, например).When 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. Аналогично Если IMEIME активен, Key имеет значение Key.ImeProcessed, и ImeProcessedKey дает исходное нажатие клавиши или клавиш.Similarly, if an IMEIME is active, Key has the value of Key.ImeProcessed, and ImeProcessedKey gives the original keystroke or keystrokes.

В следующем примере определяется обработчик для Click событием и обработчиком для KeyDown событий.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

Новое оборудование и API в операционной системе Windows 7 дают приложениям возможность получать входные данные от нескольких касаний одновременно.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 2010.Visual Studio 2010.

  • Windows 7.Windows 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. TouchMove Событие возникает несколько раз, когда пользователь перемещает палец в пределах элемента.The 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.

При использовании более двух пальцев, события возникают для каждого пальца.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.

Сведения о том, как создать приложение, которое позволяет пользователю перемещать, масштабировать и поворачивать объект, см. в разделе Пошаговое руководство: Создание первого приложения Touch.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

Рассмотрим сценарий, когда пользователь «бросает» объект.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 Свойство ManipulationDeltaEventArgs класса сообщает ли интерпретируется манипуляция — как движение, расширение или преобразование.The 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. Другими словами ManipulationDelta возникает до и после ManipulationInertiaStarting событий.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. Это событие возникает, когда ReportBoundaryFeedback метод вызывается в ManipulationDelta событий.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.

Манипуляцию можно отменить, вызвав Cancel метод в аргументах события в любого события манипуляции, за исключением ManipulationBoundaryFeedback событий.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.

Событие, вызываемое отменойThe event that Cancel is called in События мыши, возникающие для ввода, который уже произошелThe mouse events that occur for input that already occurred
ManipulationStarting и ManipulationStartedManipulationStarting and ManipulationStarted События нажатия кнопки мыши.Mouse down events.
ManipulationDelta События нажатия кнопки мыши и перемещения мыши.Mouse down and mouse move events.
ManipulationInertiaStarting и ManipulationCompletedManipulationInertiaStarting 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. Когда IsManipulationEnabled свойству true, UIElement может получать события касания и манипуляции.When the IsManipulationEnabled property is set to true, a UIElement can receive both touch and manipulation events. Если TouchDown событие не обрабатывается (то есть Handled свойство false), логика манипуляции захватывает касание элемента и создает события манипуляции.If 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. Если Handled свойству true в TouchDown событие, логика манипуляции не создает события манипуляции.If 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 метод Keyboard класса.Keyboard 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, имеют Focusable присвоено false по умолчанию; таким образом, может потребоваться присвоить этому свойству 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.

Элемент может быть включен в область фокуса в Язык XAMLExtensible Application Markup Language (XAML) , задав FocusManager присоединенное свойство IsFocusScope для true, или в коде, установив присоединенное свойство с помощью SetIsFocusScope метод.An element can be turned into a focus scope in Язык XAMLExtensible 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.

В нижеследующем примере StackPanel в область фокуса, задав IsFocusScope вложенного свойства зависимостей.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 являются областями фокуса по умолчанию Window, Menu, ToolBar, и ContextMenu.Classes in WPFWPF which are focus scopes by default are Window, Menu, ToolBar, and ContextMenu.

Элемент, имеющий фокус клавиатуры также будет иметь логический фокус для области фокуса, которой он принадлежит. Таким образом, при установке фокуса на элемент с Focus метод Keyboard класса или классов базовых элементов будет предпринята попытка передачи фокуса клавиатуры и логический фокус.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

APIAPI ввода в WPFWPF предоставляет полезные сведения о координатных пространствах.The WPFWPF input APIAPI 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? Чтобы избежать путаницы, APIAPI ввода в WPFWPF требует указания системы координат при работе с координатами, полученными посредством мыши.To avoid confusion, the WPFWPF input APIAPI 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 - интерфейсыAPIs, которые могут определить состояние захвата мыши, а также API - интерфейсыAPIs, которые могут обеспечить захват мыши в определенном элементе или очистить состояние захвата мыши.The input system exposes API - интерфейсыAPIs that can determine mouse capture state, as well as API - интерфейсы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.

RoutedCommandWPFWPF реализацию ICommand.RoutedCommand is the WPFWPF implementation of ICommand. Когда RoutedCommand выполняется, PreviewExecuted и Executed события для целевого объекта команды, которые спускаются и поднимаются по дереву элементов подобно другому вводу.When 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. Когда Executed событие достигает CommandBinding для указанной команды, ExecutedRoutedEventHandler на 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.

WPFWPF предоставляет библиотеку общих команд, которые состоит из ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, и EditingCommands, или можно определить собственные.provides a library of common commands which consists of ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, and EditingCommands, or you can define your own.

В следующем примере показано, как настроить MenuItem так, что при его выборе вызывается Paste команды TextBox, если предполагается, что TextBox имеет фокус клавиатуры.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.

Каждое из событий, Mouse, Keyboard, и Stylus определить как вложенное событие, также повторно представляется классами базовых элементов UIElement и ContentElement как новое перенаправленное событие.Each 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 и ContentElement, так как можно использовать более интуитивно понятный синтаксис обработчика событий и в XAMLXAML и в коде.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