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

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

API вводаInput API

Основной интерфейс ввода API находится в классах базовых элементов: UIElement, ContentElement, FrameworkElement и 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. Поместив входной API в базовые элементы, вместо того чтобы обрабатывать все входные события как службу, архитектура ввода позволяет источнику входных событий в пользовательском интерфейсе и поддерживать схему маршрутизации событий, в которой несколько элементов имеют ОПП. ортунити для управления входным событием.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. Например, событие нажатия клавиши связано с событиями 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

Помимо входного 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.

Примерами входного API для класса Keyboard являются свойство 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 в состоянии Down.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

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

Классы 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. @No__t-0 — это ввод с помощью пера, который стал популярным для планшетных ПК.The Stylus is a pen input made popular by the Tablet PC. приложения WPFWPF могут рассматривать перо как мышь с помощью API мыши, но WPFWPF также предоставляет абстракцию устройства пера, использующую модель, похожую на клавиатуру и мышь.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

@No__t-0 может содержать другие элементы в качестве дочерних элементов в своей модели содержимого, формируя дерево элементов.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 обычно представлены парами, состоящими из событий нисходящей и восходящей маршрутизации.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 @ no__t-2 @ no__t-3.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 @ no__t-1 @ no__t-2 и 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) для создания тысяч возможных символов в соответствующих алфавитах.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 @ no__t-2 @ no__t-3, 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. Аналогично, если редактор 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.

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

@No__t-0 определяет вложенное свойство 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.

Сведения о создании приложения, позволяющего пользователю перемещать, изменять размер и вращение объекта, см. в разделе [Walkthrough: Создание первого сенсорного приложения @ no__t-0.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.

@No__t-0 определяет следующие события манипуляции.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.

@No__t-0 также определяет событие 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

@No__t-0 всегда может получить события касания.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

Входной API WPFWPF предоставляет полезную информацию относительно координатных пространств.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? Чтобы избежать путаницы, при работе с координатами, полученными с помощью мыши, необходимо указать свой фрейм ссылки при использовании входного API WPFWPF.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. При выполнении 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