Información general sobre acciones del usuarioInput Overview

El Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona un eficaz subsistema APIAPI para obtener datos desde una variedad de dispositivos, incluido el mouse, teclado, táctil y lápiz.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. En este tema se describen los servicios que proporciona WPFWPF y se explica la arquitectura de los sistemas de entrada.This topic describes the services provided by WPFWPF and explains the architecture of the input systems.

API de entradaInput API

La entrada principal APIAPI exposición se encuentra en las clases de elementos base: UIElement, ContentElement, FrameworkElement, y FrameworkContentElement.The primary input APIAPI exposure is found on the base element classes: UIElement, ContentElement, FrameworkElement, and FrameworkContentElement. Para obtener más información sobre los elementos base, consulte Información general sobre los elementos base.For more information about the base elements, see Base Elements Overview. Estas clases proporcionan funcionalidad para los eventos de entrada relacionados con las pulsaciones de teclas, los botones del mouse, la rueda del mouse, el movimiento del mouse, la administración del foco, la captura del mouse, etc.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. Al situar la APIAPI de entrada en los elementos base, en lugar de tratar todos los eventos de entrada como un servicio, la arquitectura de entrada permite que los eventos de entrada tengan su origen en un objeto determinado en la interfaz de usuario y que admitan un esquema de enrutamiento de eventos en que más de un elemento tiene la oportunidad de controlar un evento de entrada.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. Muchos eventos de entrada tienen un par de eventos asociados.Many input events have a pair of events associated with them. Por ejemplo, la clave de evento de presionar está asociada con el KeyDown y PreviewKeyDown eventos.For example, the key down event is associated with the KeyDown and PreviewKeyDown events. La diferencia entre estos eventos radica en cómo se redirigen al elemento de destino.The difference in these events is in how they are routed to the target element. Los eventos de vista previa tunelizan el árbol de elementos desde el elemento raíz al de destino.Preview events tunnel down the element tree from the root element to the target element. Los eventos de propagación se propagan del elemento de destino al elemento raíz.Bubbling events bubble up from the target element to the root element. El enrutamiento de eventos en WPFWPF se describe con más detalle más adelante, dentro de esta información general, y en Información general sobre eventos enrutados.Event routing in WPFWPF is discussed in more detail later in this overview and in the Routed Events Overview.

Clases Keyboard y MouseKeyboard and Mouse Classes

Además de la entrada APIAPI en las clases de elementos base, el Keyboard clase y Mouse clases proporcionan adicionales APIAPI para trabajar con el teclado y mouse de entrada.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.

Ejemplos de entrada APIAPI en el Keyboard clase son el Modifiers propiedad, que devuelve el ModifierKeys presionado y el IsKeyDown método, que determina si se presiona una tecla especificada.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.

En el ejemplo siguiente se usa el GetKeyStates método para determinar si un Key está en estado presionado.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

Ejemplos de entrada APIAPI en el Mouse clase MiddleButton, que obtiene el estado del botón central del mouse, y DirectlyOver, que obtiene el elemento en el puntero del mouse está sobre.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.

El ejemplo siguiente determina si el LeftButton del mouse se encuentra en la Pressed estado.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

El Mouse y Keyboard clases se tratan con más detalle a lo largo de esta introducción.The Mouse and Keyboard classes are covered in more detail throughout this overview.

Entrada del lápizStylus Input

WPFWPF tiene compatibilidad integrada para la Stylus.has integrated support for the Stylus. El Stylus es una entrada de lápiz que popularizó la Tablet PCTablet PC.The Stylus is a pen input made popular by the Tablet PCTablet PC. Las aplicaciones de WPFWPF pueden tratar el lápiz como un mouse mediante la APIAPI de mouse, pero WPFWPF también cuenta con una abstracción del dispositivo de lápiz que usa un modelo similar al del teclado y el mouse.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. Todas las APIAPIs relacionadas con el lápiz contienen la palabra "Stylus".All stylus-related APIAPIs contain the word "Stylus".

Dado que el lápiz puede actuar como un mouse, las aplicaciones que solo admiten la entrada de mouse pueden tener cierto nivel de compatibilidad con el lápiz automáticamente.Because the stylus can act as a mouse, applications that support only mouse input can still obtain some level of stylus support automatically. Cuando se usa el lápiz de esta forma, la aplicación tiene la oportunidad de controlar el evento de lápiz adecuado y, a continuación, el evento de mouse correspondiente.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. Además, los servicios de nivel superior, como las entradas manuscritas, también están disponibles a través de la abstracción del dispositivo de lápiz.In addition, higher-level services such as ink input are also available through the stylus device abstraction. Para obtener más información sobre la escritura con lápiz como entrada, consulte Introducción a las entradas manuscritas.For more information about ink as input, see Getting Started with Ink.

Enrutamiento de eventosEvent Routing

Un FrameworkElement puede contener otros elementos como elementos secundarios en su modelo de contenido, que forman un árbol de elementos.A FrameworkElement can contain other elements as child elements in its content model, forming a tree of elements. En WPFWPF, el elemento primario puede participar en la entrada dirigida a sus elementos secundarios o a otros descendientes al controlar los eventos.In WPFWPF, the parent element can participate in input directed to its child elements or other descendants by handing events. Esto es especialmente útil para crear controles a partir de los controles más pequeños, un proceso conocido como "composición de controles" o "composición".This is especially useful for building controls out of smaller controls, a process known as "control composition" or "compositing." Para obtener más información acerca de los árboles de elementos y cómo se relacionan con las rutas de eventos, consulte Árboles en WPF.For more information about element trees and how element trees relate to event routes, see Trees in WPF.

El enrutamiento de eventos es el proceso de reenviar eventos a varios elementos para que un objeto o elemento determinado de la ruta pueda elegir ofrecer una respuesta significativa (a través del control) a un evento que podría tener su origen en otro elemento.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. Los eventos enrutados usan uno de los tres mecanismos de enrutamiento: directo, propagación y tunelización.Routed events use one of three routing mechanisms: direct, bubbling, and tunneling. En el enrutamiento directo, el elemento de origen es el único elemento notificado y el evento no se redirige a ningún otro elemento.In direct routing, the source element is the only element notified, and the event is not routed to any other elements. Sin embargo, el evento enrutado directo todavía ofrece algunas funcionalidades adicionales que solo están presentes para eventos enrutados, en lugar de para eventos de CLRCLR estándares.However, the direct routed event still offers some additional capabilities that are only present for routed events as opposed to standard CLRCLR events. La propagación prepara el árbol de elementos: en primer lugar, notifica al elemento que dio origen al evento; a continuación, al elemento primario, etc.Bubbling works up the element tree by first notifying the element that sourced the event, then the parent element, and so on. La tunelización comienza en la raíz del árbol de elementos y desciende para acabar con el elemento de origen original.Tunneling starts at the root of the element tree and works down, ending with the original source element. Para obtener más información sobre los eventos enrutados, consulte Información general sobre eventos enrutados.For more information about routed events, see Routed Events Overview.

Los eventos de entrada de WPFWPF suelen encontrarse en parejas formadas por un evento de tunelización y otro de propagación.WPFWPF input events generally come in pairs that consists of a tunneling event and a bubbling event. Los eventos de tunelización se distinguen de los eventos de propagación con el prefijo "Preview".Tunneling events are distinguished from bubbling events with the "Preview" prefix. Por ejemplo, PreviewMouseMove es la versión de tunelización de un evento de mover el mouse y MouseMove es la versión de propagación de este evento.For instance, PreviewMouseMove is the tunneling version of a mouse move event and MouseMove is the bubbling version of this event. Este emparejamiento de eventos es una convención que se implementa en el nivel de elemento y no es una funcionalidad propia del sistema de eventos de 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. Para obtener más información, consulte la sección Eventos de entrada de WPF en Información general sobre eventos enrutados.For details, see the WPF Input Events section in Routed Events Overview.

Control de eventos de entradaHandling Input Events

Para recibir una entrada en un elemento, se debe asociar un controlador de eventos con el evento concreto.To receive input on an element, an event handler must be associated with that particular event. En XAMLXAML es sencillo: se debe hacer referencia al nombre del evento como atributo del elemento que se escuchará para este evento.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. A continuación, se establece el valor del atributo con el nombre del controlador de eventos que se define, en función de un delegado.Then, you set the value of the attribute to the name of the event handler that you define, based on a delegate. El controlador de eventos debe escribirse en código, como C# y se puede incluir en un archivo de código subyacente.The event handler must be written in code such as C# and can be included in a code-behind file.

Los eventos de teclado tienen lugar cuando el sistema operativo notifica acciones de teclas que se producen mientras el foco del teclado está en un elemento.Keyboard events occur when the operating system reports key actions that occur while keyboard focus is on an element. Los eventos de mouse y lápiz se dividen en dos categorías: eventos que informan de cambios en la posición del puntero en relación con el elemento y eventos que informan de cambios en el estado de los botones del dispositivo.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.

Ejemplo de evento de entrada de tecladoKeyboard Input Event Example

En el ejemplo siguiente se escucha una pulsación de tecla de flecha izquierda.The following example listens for a left arrow key press. Un StackPanel se crea que tiene un Button.A StackPanel is created that has a Button. Un controlador de eventos para escuchar para presionar la tecla de flecha izquierda se adjunta a la Button instancia.An event handler to listen for the left arrow key press is attached to the Button instance.

La primera sección del ejemplo se crea el StackPanel y Button y asocia el controlador de eventos para el 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

La segunda sección está escrita en código y define el controlador de eventos.The second section is written in code and defines the event handler. Cuando se presiona la tecla de flecha izquierda y la Button tiene el foco de teclado, se ejecuta el controlador y el Background color de la Button se cambia.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. Si se presiona la tecla, pero no es la tecla de flecha izquierda, el Background color de la Button se vuelve a cambiar su color inicial.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

Ejemplo de evento de entrada de mouseMouse Input Event Example

En el ejemplo siguiente, la Background color de un Button cambia cuando el puntero del mouse entra en el Button.In the following example, the Background color of a Button is changed when the mouse pointer enters the Button. El Background color se restaura cuando el mouse abandona el Button.The Background color is restored when the mouse leaves the Button.

La primera sección del ejemplo se crea el StackPanel y el Button controlar y adjunta los controladores de eventos para el MouseEnter y MouseLeave eventos para el 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

La segunda sección del ejemplo está escrita en código y define los controladores de eventos.The second section of the example is written in code and defines the event handlers. Cuando el mouse entra en el Button, Background color de la Button cambia a SlateGray.When the mouse enters the Button, the Background color of the Button is changed to SlateGray. Cuando el mouse abandona el Button, el Background color de la Button vuelve a cambiar a 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

Entrada de textoText Input

El TextInput evento le permite realizar escuchas de entrada de texto de una manera independiente del dispositivo.The TextInput event enables you to listen for text input in a device-independent manner. El teclado es el medio principal de entrada de texto, pero la voz, la escritura a mano y otros dispositivos de entrada también pueden generar entradas de texto.The keyboard is the primary means of text input, but speech, handwriting, and other input devices can generate text input also.

Para la entrada de teclado, WPFWPF envía primero adecuado KeyDown / KeyUp eventos.For keyboard input, WPFWPF first sends the appropriate KeyDown/KeyUp events. Si no se controlan los eventos y la tecla es textual en lugar de (una tecla de control como flechas direccionales) o las teclas de función, un TextInput provoca el evento.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. No siempre hay una asignación unívoca simple entre KeyDown / KeyUp y TextInput eventos debido a varias pulsaciones de tecla pueden generar un único carácter de entrada de texto y pulsaciones de teclas solo pueden generar varios caracteres cadenas.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. Esto es especialmente cierto en el caso de idiomas como el chino, japonés y coreano, que usan Editores de métodos de entrada (IMEs)Input Method Editors (IMEs) para generar los miles de caracteres posibles de sus alfabetos correspondientes.This is especially true for languages such as Chinese, Japanese, and Korean which use Editores de métodos de entrada (IMEs)Input Method Editors (IMEs) to generate the thousands of possible characters in their corresponding alphabets.

Cuando WPFWPF envía un KeyUp / KeyDown eventos, Key está establecido en Key.System si las pulsaciones de teclas podrían formar parte de un TextInput eventos (si se presiona ALT + S, por ejemplo).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). Esto permite que el código en un KeyDown controlador de eventos para comprobar si Key.System y, si lo encuentra, deje el procesamiento para el controlador de generará posteriormente TextInput eventos.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. En estos casos, las diversas propiedades de la TextCompositionEventArgs argumento se puede usar para determinar las pulsaciones de teclas originales.In these cases, the various properties of the TextCompositionEventArgs argument can be used to determine the original keystrokes. De forma similar, si un IMEIME está activo, Key tiene el valor de Key.ImeProcessed, y ImeProcessedKey ofrece la pulsación de tecla o pulsaciones de teclas originales.Similarly, if an IMEIME is active, Key has the value of Key.ImeProcessed, and ImeProcessedKey gives the original keystroke or keystrokes.

En el ejemplo siguiente se define un controlador para el Click eventos y un controlador para el KeyDown eventos.The following example defines a handler for the Click event and a handler for the KeyDown event.

El primer segmento de código o marcado crea la interfaz de usuario.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

El segundo segmento de código contiene los controladores de eventos.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

Dado que los eventos de entrada se propagan en la ruta del evento, el StackPanel recibe la entrada independientemente del elemento que tiene el foco de teclado.Because input events bubble up the event route, the StackPanel receives the input regardless of which element has keyboard focus. El TextBox control se notifica primero y el OnTextInputKeyDown se llama al controlador sólo si el TextBox no controló la entrada.The TextBox control is notified first and the OnTextInputKeyDown handler is called only if the TextBox did not handle the input. Si el PreviewKeyDown eventos se usan en lugar de la KeyDown eventos, el OnTextInputKeyDown se llama al controlador en primer lugar.If the PreviewKeyDown event is used instead of the KeyDown event, the OnTextInputKeyDown handler is called first.

En este ejemplo, la lógica de control se escribe dos veces: una vez para CTRL+O y otra para el evento de clic del botón.In this example, the handling logic is written two times—one time for CTRL+O, and again for button's click event. Esto se puede simplificar mediante el uso de comandos, en lugar de controlar los eventos de entrada directamente.This can be simplified by using commands, instead of handling the input events directly. Los comandos se describen en esta información general y en Información general sobre comandos.Commands are discussed in this overview and in Commanding Overview.

Funciones táctiles y manipulaciónTouch and Manipulation

El nuevo hardware y la API en el sistema operativo Windows 7 proporcionan a las aplicaciones la capacidad de recibir entradas de varios toques simultáneamente.New hardware and API in the Windows 7 operating system provide applications the ability to receive input from multiple touches simultaneously. WPFWPF permite que las aplicaciones detecten las funciones táctiles y respondan a ellas del mismo modo que con otras entradas, como el mouse o el teclado, y que generen eventos cuando se detecta un toque.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 expone dos tipos de eventos cuando se usa una función táctil: eventos de función táctil y eventos de manipulación.exposes two types of events when touch occurs: touch events and manipulation events. Los eventos de función táctil proporcionan datos sin procesar sobre cada dedo en una pantalla táctil y su movimiento.Touch events provide raw data about each finger on a touchscreen and its movement. Los eventos de manipulación interpretan la entrada como determinadas acciones.Manipulation events interpret the input as certain actions. Ambos tipos de eventos se describen en esta sección.Both types of events are discussed in this section.

Requisitos previosPrerequisites

Para desarrollar una aplicación que responda a las funciones táctiles, necesitará los componentes siguientes.You need the following components to develop an application that responds to touch.

  • Visual Studio 2010.Visual Studio 2010.

  • Windows 7.Windows 7.

  • Un dispositivo, como una pantalla táctil, compatible con Windows Touch.A device, such as a touchscreen, that supports Windows Touch.

TerminologíaTerminology

Para referirse a la función táctil, se usan los términos siguientes.The following terms are used when touch is discussed.

  • La función táctil es un tipo de entrada de usuario que reconoce Windows 7.Touch is a type of user input that is recognized by Windows 7. Normalmente, se inicia colocando los dedos en una pantalla táctil.Usually, touch is initiated by putting fingers on a touch-sensitive screen. Tenga en cuenta que algunos dispositivos, como el panel táctil habitual en portátiles, no admiten la función táctil cuando se limitan a convertir la posición y el movimiento del dedo a entradas de mouse.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.

  • La función multitáctil es una función táctil que tiene lugar desde más de un punto de forma simultánea.Multitouch is touch that occurs from more than one point simultaneously. Windows 7 y WPFWPF admiten la función multitáctil.Windows 7 and WPFWPF supports multitouch. Cada vez que se menciona la función táctil en la documentación de WPFWPF, los conceptos se aplican a la función multitáctil.Whenever touch is discussed in the documentation for WPFWPF, the concepts apply to multitouch.

  • Una manipulación se produce cuando la función táctil se interpreta como una acción física que se aplica a un objeto.A manipulation occurs when touch is interpreted as a physical action that is applied to an object. En WPFWPF, los eventos de manipulación interpretan las entradas como una manipulación de traducción, expansión o rotación.In WPFWPF, manipulation events interpret input as a translation, expansion, or rotation manipulation.

  • touch device representa un dispositivo que genera entradas táctiles, como un solo dedo en una pantalla táctil.A touch device represents a device that produces touch input, such as a single finger on a touchscreen.

Controles que responden a la función táctilControls that Respond to Touch

Los siguientes controles se pueden desplazar al arrastrar un dedo por el control si tiene contenido que se desplaza fuera de la vista.The following controls can be scrolled by dragging a finger across the control if it has content that is scrolled out of view.

El ScrollViewer define la ScrollViewer.PanningMode adjunta la propiedad que le permite especificar si se habilita la panorámica táctil horizontalmente, verticalmente, ambos o ninguno.The ScrollViewer defines the ScrollViewer.PanningMode attached property that enables you to specify whether touch panning is enabled horizontally, vertically, both, or neither. El ScrollViewer.PanningDeceleration propiedad especifica la rapidez ralentiza el desplazamiento cuando el usuario levanta el dedo desde la pantalla táctil.The ScrollViewer.PanningDeceleration property specifies how quickly the scrolling slows down when the user lifts the finger from the touchscreen. El ScrollViewer.PanningRatio propiedad adjunta especifica la proporción de desplazamiento para traducir el desplazamiento de manipulación.The ScrollViewer.PanningRatio attached property specifies the ratio of scrolling offset to translate manipulation offset.

Eventos de funciones táctilesTouch Events

Las clases base, UIElement, UIElement3D, y ContentElement, definen eventos que pueden suscribir para que la aplicación responda a la entrada táctil.The base classes, UIElement, UIElement3D, and ContentElement, define events that you can subscribe to so your application will respond to touch. Los eventos de funciones táctiles resultan útiles cuando la aplicación interpreta la función táctil como algo distinto a la manipulación de un objeto.Touch events are useful when your application interprets touch as something other than manipulating an object. Por ejemplo, una aplicación que permite a un usuario dibujar con uno o más dedos podría suscribirse a los eventos de función táctil.For example, an application that enables a user to draw with one or more fingers would subscribe to touch events.

Las tres clases definen los siguientes eventos, que se comportan de forma similar, independientemente de la clase de definición.All three classes define the following events, which behave similarly, regardless of the defining class.

Del mismo modo que los eventos de teclado y mouse, los eventos de función táctil son eventos enrutados.Like keyboard and mouse events, the touch events are routed events. Los eventos que empiezan por Preview son eventos de tunelización, mientras que los que empiezan por Touch son eventos de propagación.The events that begin with Preview are tunneling events and the events that begin with Touch are bubbling events. Para obtener más información sobre los eventos enrutados, consulte Información general sobre eventos enrutados.For more information about routed events, see Routed Events Overview. Al controlar estos eventos, puede obtener la posición de la entrada, con respecto a cualquier elemento, mediante una llamada a la GetTouchPoint o GetIntermediateTouchPoints método.When you handle these events, you can get the position of the input, relative to any element, by calling the GetTouchPoint or GetIntermediateTouchPoints method.

Para entender la interacción entre los eventos de función táctil, considere un escenario en que un usuario coloca un dedo en un elemento, lo mueve en el elemento y, a continuación, lo levanta.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. En la ilustración siguiente se muestra la ejecución de los eventos de propagación (los eventos de tunelización se omiten por motivos de simplicidad).The following illustration shows the execution of the bubbling events (the tunneling events are omitted for simplicity).

La secuencia de eventos de toque. Touch eventosThe sequence of touch events. Touch events

En la lista siguiente se describe la secuencia de los eventos de la ilustración anterior.The following list describes the sequence of the events in the preceding illustration.

  1. El TouchEnter evento tiene lugar una vez cuando el usuario coloca un dedo en el elemento.The TouchEnter event occurs one time when the user puts a finger on the element.

  2. El TouchDown evento tiene lugar una vez.The TouchDown event occurs one time.

  3. El TouchMove evento tiene lugar varias veces cuando el usuario mueve el dedo dentro del elemento.The TouchMove event occurs multiple times as the user moves the finger within the element.

  4. El TouchUp evento tiene lugar una vez cuando el usuario levanta el dedo del elemento.The TouchUp event occurs one time when the user lifts the finger from the element.

  5. El TouchLeave evento tiene lugar una vez.The TouchLeave event occurs one time.

Cuando se usan más de dos dedos, se producen eventos para cada dedo.When more than two fingers are used, the events occur for each finger.

Eventos de manipulaciónManipulation Events

Para los casos donde una aplicación permite a un usuario manipular un objeto, el UIElement clase define los eventos de manipulación.For cases where an application enables a user to manipulate an object, the UIElement class defines manipulation events. A diferencia de los eventos de función táctil que, simplemente, notifican la posición de la función táctil, los eventos de manipulación indican cómo se puede interpretar la entrada.Unlike the touch events that simply report the position of touch, the manipulation events report how the input can be interpreted. Hay tres tipos de manipulación: traducción, expansión y rotación.There are three types of manipulations, translation, expansion, and rotation. En la lista siguiente se describe cómo invocar los tres tipos de manipulaciones.The following list describes how to invoke the three types of manipulations.

  • Coloque un dedo en un objeto y mueva el dedo por la pantalla táctil para invocar una manipulación de traducción.Put a finger on an object and move the finger across the touchscreen to invoke a translation manipulation. Normalmente, esto mueve el objeto.This usually moves the object.

  • Coloque dos dedos en un objeto y acérquelos o aléjelos para invocar una manipulación de expansión.Put two fingers on an object and move the fingers closer together or farther apart from one another to invoke an expansion manipulation. Normalmente, esto cambia el tamaño del objeto.This usually resizes the object.

  • Coloque dos dedos en un objeto y gírelos entre sí para invocar una manipulación de rotación.Put two fingers on an object and rotate the fingers around each other to invoke a rotation manipulation. Normalmente, esto gira el objeto.This usually rotates the object.

Se puede producir más de un tipo de manipulación al mismo tiempo.More than one type of manipulation can occur simultaneously.

Cuando hace que los objetos respondan a manipulaciones, puede hacer que parezca que el objeto tenga inercia.When you cause objects to respond to manipulations, you can have the object appear to have inertia. Esto puede hacer que los objetos simulen el mundo físico.This can make your objects simulate the physical world. Por ejemplo, si empuja un libro encima de una mesa con suficiente fuerza, el libro seguirá moviéndose cuando lo suelte.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 le permite simular este comportamiento, ya que puede generar eventos de manipulación cuando los dedos del usuario liberan el objeto.enables you to simulate this behavior by raising manipulation events after the user's fingers releases the object.

Para obtener información sobre cómo crear una aplicación que permite al usuario mover, cambiar el tamaño y girar un objeto, vea Tutorial: Crear su primera aplicación táctil.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.

El UIElement define los siguientes eventos de manipulación.The UIElement defines the following manipulation events.

De forma predeterminada, un UIElement no recibe estos eventos de manipulación.By default, a UIElement does not receive these manipulation events. Para recibir eventos de manipulación en una UIElement, establezca UIElement.IsManipulationEnabled a true.To receive manipulation events on a UIElement, set UIElement.IsManipulationEnabled to true.

Ruta de acceso de ejecución de eventos de manipulaciónThe Execution Path of Manipulation Events

Considere un escenario en que un usuario "lanza" un objeto.Consider a scenario where a user "throws" an object. El usuario coloca un dedo en el objeto, mueve el dedo por la pantalla táctil una distancia corta y, a continuación, lo levanta mientras se mueve.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. El resultado es que el objeto se moverá bajo el dedo del usuario y lo seguirá haciendo cuando el usuario lo levante.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.

En la ilustración siguiente se muestra la ruta de acceso de ejecución de los eventos de manipulación e información importante sobre cada evento.The following illustration shows the execution path of manipulation events and important information about each event.

La secuencia de eventos de manipulación. eventos de manipulaciónThe sequence of manipulation events. Manipulation events

En la lista siguiente se describe la secuencia de los eventos de la ilustración anterior.The following list describes the sequence of the events in the preceding illustration.

  1. El ManipulationStarting evento tiene lugar cuando el usuario coloca un dedo en el objeto.The ManipulationStarting event occurs when the user places a finger on the object. Entre otras cosas, este evento permite establecer el ManipulationContainer propiedad.Among other things, this event allows you to set the ManipulationContainer property. En los eventos posteriores, la posición de la manipulación será relativa a la ManipulationContainer.In the subsequent events, the position of the manipulation will be relative to the ManipulationContainer. En los eventos que no sea ManipulationStarting, esta propiedad es de solo lectura, por lo que el ManipulationStarting evento es la única vez que se puede establecer esta propiedad.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. El ManipulationStarted a continuación se produce el evento.The ManipulationStarted event occurs next. Este evento indica el origen de la manipulación.This event reports the origin of the manipulation.

  3. El ManipulationDelta evento tiene lugar varias veces a medida que mueve los dedos de un usuario en una pantalla táctil.The ManipulationDelta event occurs multiple times as a user's fingers move on a touchscreen. El DeltaManipulation propiedad de la ManipulationDeltaEventArgs clase notifica si la manipulación se interpreta como movimiento, expansión o traducción.The DeltaManipulation property of the ManipulationDeltaEventArgs class reports whether the manipulation is interpreted as movement, expansion, or translation. En este punto se realiza la mayoría del trabajo de manipulación de un objeto.This is where you perform most of the work of manipulating an object.

  4. El ManipulationInertiaStarting evento tiene lugar cuando los dedos del usuario pierden el contacto con el objeto.The ManipulationInertiaStarting event occurs when the user's fingers lose contact with the object. Este evento permite especificar la desaceleración de las manipulaciones durante la inercia.This event enables you to specify the deceleration of the manipulations during inertia. Esto sirve para que el objeto pueda emular espacios físicos o atributos diferentes, si así lo elige.This is so your object can emulate different physical spaces or attributes if you choose. Por ejemplo, suponga que la aplicación tiene dos objetos que representan elementos del mundo físico y que uno es más pesado que el otro.For example, suppose your application has two objects that represent items in the physical world, and one is heavier than the other. Puede hacer que el objeto más pesado disminuya su velocidad más rápidamente que el objeto ligero.You can make the heavier object decelerate faster than the lighter object.

  5. El ManipulationDelta varias veces cuando se produce la inercia se produce el evento.The ManipulationDelta event occurs multiple times as inertia occurs. Tenga en cuenta que este evento se produce cuando los dedos del usuario se mueven por la pantalla táctil y WPFWPF simula la inercia.Note that this event occurs when the user's fingers move across the touchscreen and when WPFWPF simulates inertia. En otras palabras, ManipulationDelta se produce antes y después el ManipulationInertiaStarting eventos.In other words, ManipulationDelta occurs before and after the ManipulationInertiaStarting event. El ManipulationDeltaEventArgs.IsInertial propiedad informes si el ManipulationDelta evento tiene lugar durante la inercia, para que pueda comprobar la propiedad y realizar acciones diferentes, dependiendo de su valor.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. El ManipulationCompleted evento se produce cuando finaliza la manipulación y la inercia.The ManipulationCompleted event occurs when the manipulation and any inertia ends. Es decir, después de todo el ManipulationDelta se producen eventos, el ManipulationCompleted se produce un evento para indicar que se completa la manipulación.That is, after all the ManipulationDelta events occur, the ManipulationCompleted event occurs to signal that the manipulation is complete.

El UIElement también define la ManipulationBoundaryFeedback eventos.The UIElement also defines the ManipulationBoundaryFeedback event. Este evento se produce cuando el ReportBoundaryFeedback se llama al método el ManipulationDelta eventos.This event occurs when the ReportBoundaryFeedback method is called in the ManipulationDelta event. El ManipulationBoundaryFeedback evento permite proporcionar comentarios visuales cuando un objeto alcanza un límite de las aplicaciones o componentes.The ManipulationBoundaryFeedback event enables applications or components to provide visual feedback when an object hits a boundary. Por ejemplo, el Window clase controla la ManipulationBoundaryFeedback eventos a la ventana se mueva ligeramente cuando se encuentra el borde.For example, the Window class handles the ManipulationBoundaryFeedback event to cause the window to slightly move when its edge is encountered.

Puede cancelar la manipulación mediante una llamada a la Cancel método en los argumentos de evento de cualquier evento de manipulación excepto ManipulationBoundaryFeedback eventos.You can cancel the manipulation by calling the Cancel method on the event arguments in any manipulation event except ManipulationBoundaryFeedback event. Cuando se llama a Cancel, ya no se generan los eventos de manipulación y se producen los eventos del mouse para el tacto.When you call Cancel, the manipulation events are no longer raised and mouse events occur for touch. En la tabla siguiente se describe la relación entre el momento en que se cancela la manipulación y los eventos del mouse que se producen.The following table describes the relationship between the time the manipulation is canceled and the mouse events that occur.

Evento con el que se llama al método CancelThe event that Cancel is called in Eventos del mouse que se generan para entradas que ya se han producidoThe mouse events that occur for input that already occurred
ManipulationStarting y ManipulationStartedManipulationStarting and ManipulationStarted Eventos de presión del mouse.Mouse down events.
ManipulationDelta Eventos de presión y movimiento del mouse.Mouse down and mouse move events.
ManipulationInertiaStarting y ManipulationCompletedManipulationInertiaStarting and ManipulationCompleted Eventos de presión, movimiento y liberación del mouse.Mouse down, mouse move, and mouse up events.

Tenga en cuenta que si se llama a Cancel cuando la manipulación está en inercia, el método devuelve false y la entrada no genera eventos del mouse.Note that if you call Cancel when the manipulation is in inertia, the method returns false and the input does not raise mouse events.

Relación entre eventos de función táctil y manipulaciónThe Relationship Between Touch and Manipulation Events

Un UIElement siempre puede recibir eventos de toque.A UIElement can always receive touch events. Cuando el IsManipulationEnabled propiedad está establecida en true, un UIElement puede recibir eventos de manipulación y toque.When the IsManipulationEnabled property is set to true, a UIElement can receive both touch and manipulation events. Si el TouchDown no se controla el evento (es decir, el Handled propiedad es false), la lógica de manipulación captura la entrada táctil en el elemento y genera los eventos de manipulación.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. Si el Handled propiedad está establecida en true en el TouchDown eventos, la lógica de manipulación no generan eventos de manipulación.If the Handled property is set to true in the TouchDown event, the manipulation logic does not generate manipulation events. En la siguiente ilustración se muestra la relación entre los eventos de función táctil y los de manipulación.The following illustration shows the relationship between touch events and manipulation events.

Relación entre los eventos de manipulación y toque eventos de manipulación y toqueRelationship between touch and manipulation events Touch and manipulation events

En la lista siguiente se describe la relación entre los eventos de función táctil y de manipulación que se muestra en la ilustración anterior.The following list describes the relationship between the touch and manipulation events that is shown in the preceding illustration.

FocoFocus

Hay dos conceptos principales relacionados con el foco en WPFWPF: el foco de teclado y el foco lógico.There are two main concepts that pertain to focus in WPFWPF: keyboard focus and logical focus.

Foco de tecladoKeyboard Focus

El foco de teclado hace referencia al elemento que recibe la entrada del teclado.Keyboard focus refers to the element that is receiving keyboard input. Puede haber un único elemento en todo el escritorio que tenga el foco de teclado.There can be only one element on the whole desktop that has keyboard focus. En WPFWPF, el elemento que tiene el foco de teclado tendrá IsKeyboardFocused establecido en true.In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. Estático Keyboard método FocusedElement devuelve el elemento que tiene actualmente el foco de teclado.The static Keyboard method FocusedElement returns the element that currently has keyboard focus.

El foco de teclado puede obtenerse mediante el tabulador hasta un elemento o haga clic en el mouse en determinados elementos, como un TextBox.Keyboard focus can be obtained by tabbing to an element or by clicking the mouse on certain elements, such as a TextBox. El foco de teclado también puede obtenerse mediante programación utilizando la Focus método en el Keyboard clase.Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Focus intenta dar el foco de teclado del elemento especificado.Focus attempts to give the specified element keyboard focus. El elemento devuelto por Focus es el elemento que tiene actualmente el foco de teclado.The element returned by Focus is the element that currently has keyboard focus.

Para un elemento obtenga el foco de teclado del Focusable propiedad y el IsVisible propiedades deben establecerse en true.In order for an element to obtain keyboard focus the Focusable property and the IsVisible properties must be set to true. Algunas clases, como Panel, tienen Focusable establecido en false de forma predeterminada; por lo tanto, es posible que deba establecer esta propiedad en true si quiere que ese elemento pueda recibir el foco.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.

En el ejemplo siguiente se usa Focus para establecer el foco de teclado en un Button.The following example uses Focus to set keyboard focus on a Button. Es el lugar recomendado para establecer el foco inicial en una aplicación en el Loaded controlador de eventos.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

Para obtener más información acerca del foco de teclado, consulte Foco de teclado.For more information about keyboard focus, see Focus Overview.

Foco lógicoLogical Focus

Foco lógico hace referencia a la FocusManager.FocusedElement en un ámbito de foco.Logical focus refers to the FocusManager.FocusedElement in a focus scope. Puede haber varios elementos que tengan el foco lógico en una aplicación, pero solo puede haber uno con el foco lógico en un ámbito de foco concreto.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.

Un ámbito de foco es un elemento contenedor que realiza un seguimiento de la FocusedElement dentro de su ámbito.A focus scope is a container element that keeps track of the FocusedElement within its scope. Cuando el foco sale de un ámbito de foco, el elemento enfocado pierde el foco de teclado, pero conserva el foco lógico.When focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. Cuando el foco vuelve al ámbito de foco, el elemento enfocado recibe el foco de teclado.When focus returns to the focus scope, the focused element will obtain keyboard focus. Esto permite cambiar el foco de teclado entre varios ámbitos de foco, pero garantiza que el elemento enfocado dentro del ámbito siga siendo el elemento enfocado cuando vuelva el foco.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.

Un elemento se puede convertir en un ámbito de foco en Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) estableciendo el FocusManager propiedad adjunta IsFocusScope a true, o bien mediante código estableciendo la propiedad adjunta mediante el SetIsFocusScope método.An element can be turned into a focus scope in Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) by setting the FocusManager attached property IsFocusScope to true, or in code by setting the attached property by using the SetIsFocusScope method.

En el ejemplo siguiente se realiza una StackPanel en un ámbito de foco estableciendo el IsFocusScope propiedad adjunta.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)

Las clases de WPFWPF que son ámbitos de foco de forma predeterminada son Window, Menu, ToolBar, y ContextMenu.Classes in WPFWPF which are focus scopes by default are Window, Menu, ToolBar, and ContextMenu.

Un elemento que tiene el foco de teclado también tendrá el foco lógico para el ámbito de foco que pertenece a; por lo tanto, establecer el foco en un elemento con el Focus método en el Keyboard clase o clases de elementos base intentará dar el foco de teclado de elemento y el foco lógico.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.

Para determinar el elemento con foco en un ámbito de foco, utilice GetFocusedElement.To determine the focused element in a focus scope, use GetFocusedElement. Para cambiar el elemento con foco de un ámbito de foco, utilice SetFocusedElement.To change the focused element for a focus scope, use SetFocusedElement.

Para obtener más información acerca del foco lógico, consulte Foco lógico.For more information about logical focus, see Focus Overview.

Posición del mouseMouse Position

La APIAPI de entrada de WPFWPF proporciona información útil respecto a los espacios de coordenadas.The WPFWPF input APIAPI provides helpful information with regard to coordinate spaces. Por ejemplo, la coordenada (0,0) es la coordenada superior izquierda, pero ¿de qué elemento del árbol?For example, coordinate (0,0) is the upper-left coordinate, but the upper-left of which element in the tree? ¿El elemento de destino de la entrada?The element that is the input target? ¿El elemento adjunto al controlador de eventos?The element you attached your event handler to? ¿O alguna otra cosa?Or something else? Para evitar confusiones, la APIAPI de entrada de WPFWPF requiere que especifique el marco de referencia cuando trabaje con coordenadas obtenidas a través del mouse.To avoid confusion, the WPFWPF input APIAPI requires that you specify your frame of reference when you work with coordinates obtained through the mouse. El GetPosition método devuelve la coordenada del puntero del mouse en relación con el elemento especificado.The GetPosition method returns the coordinate of the mouse pointer relative to the specified element.

Captura del mouseMouse Capture

Los dispositivos de mouse tienen una característica modal concreta que se denomina captura del mouse.Mouse devices specifically hold a modal characteristic known as mouse capture. La captura del mouse se usa para mantener un estado de entrada transitorio cuando se inicia una operación de arrastrar y colocar, para que otras operaciones relacionadas con la posición en pantalla nominal del puntero del mouse no se produzcan necesariamente.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. Al arrastrar, el usuario no puede hacer clic sin anular la acción de arrastrar y colocar, lo que hace que la mayoría de las indicaciones que se producen al pasar el mouse sean inadecuadas mientras se conserva la captura del mouse desde el origen de la acción de arrastrar.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. El sistema de entrada expone APIAPIs que pueden determinar el estado de captura del mouse, además de APIAPIs que pueden forzar la captura del mouse en un elemento concreto o borrar el estado de la captura del mouse.The input system exposes APIAPIs that can determine mouse capture state, as well as APIAPIs that can force mouse capture to a specific element, or clear mouse capture state. Para obtener más información sobre las operaciones de arrastrar y colocar, consulte Información general sobre la función de arrastrar y colocar.For more information on drag-and-drop operations, see Drag and Drop Overview.

ComandosCommands

Los comandos habilitan el control de entrada en un nivel más semántico que la entrada de dispositivos.Commands enable input handling at a more semantic level than device input. Los comandos son directivas sencillas, como Cut, Copy, Paste o Open.Commands are simple directives, such as Cut, Copy, Paste, or Open. Los comandos son útiles para centralizar la lógica de comando.Commands are useful for centralizing your command logic. Puede tener acceso el mismo comando desde un Menu, en un ToolBar, o a través de un método abreviado de teclado.The same command might be accessed from a Menu, on a ToolBar, or through a keyboard shortcut. Los comandos también proporcionan un mecanismo para deshabilitar controles cuando el comando deja de estar disponible.Commands also provide a mechanism for disabling controls when the command becomes unavailable.

RoutedCommand es el WPFWPF implementací ICommand.RoutedCommand is the WPFWPF implementation of ICommand. Cuando un RoutedCommand se ejecuta, un PreviewExecuted y un Executed eventos se generan en el destino del comando, y se tunelizan y propagan a través del árbol de elementos como otra entrada.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. Si no se define ningún destino de comando, el elemento con el foco de teclado será el destino del comando.If a command target is not set, the element with keyboard focus will be the command target. La lógica que ejecuta el comando se adjunta a un CommandBinding.The logic that performs the command is attached to a CommandBinding. Cuando un Executed evento alcanza un CommandBinding para ese comando concreto, el ExecutedRoutedEventHandler en el CommandBinding se llama.When an Executed event reaches a CommandBinding for that specific command, the ExecutedRoutedEventHandler on the CommandBinding is called. Este controlador realiza la acción del comando.This handler performs the action of the command.

Para obtener más información sobre los comandos, consulte Información general sobre los comandos.For more information on commanding, see Commanding Overview.

WPFWPF Proporciona una biblioteca de comandos comunes que consta de ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, y EditingCommands, o puede definir sus propios.provides a library of common commands which consists of ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, and EditingCommands, or you can define your own.

El ejemplo siguiente muestra cómo configurar un MenuItem para que cuando se hace clic en invocará el Paste comando el TextBox, suponiendo que el TextBox tiene el foco de teclado.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

Para obtener más información sobre los comandos en WPFWPF, consulte Información general sobre comandos.For more information about commands in WPFWPF, see Commanding Overview.

Sistema de entrada y elementos baseThe Input System and Base Elements

Eventos de entrada como los eventos adjuntos definidos por el Mouse, Keyboard, y Stylus clases son generadas por el sistema de entrada e insertadas en una posición concreta en el modelo de objetos basado en el árbol visual en tiempo de ejecución de la prueba de posicionamiento.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.

Cada uno de los eventos que Mouse, Keyboard, y Stylus definir como un evento adjunto también se vuelve a exponer desde las clases de elementos base UIElement y ContentElement como un nuevo evento enrutado.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. Los eventos enrutados de elementos base se generan desde clases que controlan el evento adjunto original y reutilizan los datos del evento.The base element routed events are generated by classes handling the original attached event and reusing the event data.

Cuando el evento de entrada se asocia con un elemento de origen determinado a través de la implementación del evento de entrada de elemento base, se puede redirigir a través del resto de una ruta de evento que se basa en una combinación de objetos del árbol lógico y visual, y se puede controlar desde el código de la aplicación.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. Por lo general, resulta más conveniente controlar estos eventos de entrada relacionados con los dispositivos con los eventos enrutados en UIElement y ContentElement, ya que puede usar más intuitivo evento una sintaxis de controlador en XAMLXAML y en el código.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. También puede elegir controlar el evento adjunto que inició el proceso, pero tendría que enfrentarse a varios problemas: el evento adjunto puede estar marcado como controlado por el control de la clase de elemento base, y debe utilizar métodos de descriptor de acceso, en lugar de la sintaxis de eventos true a fin de adjuntar controladores para eventos adjuntos.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.

Pasos adicionalesWhat's Next

Ahora dispone de varias técnicas para controlar la entrada en WPFWPF.You now have several techniques to handle input in WPFWPF. También debe tener una mejor comprensión de los distintos tipos de eventos de entrada y los mecanismos de eventos enrutados que usa WPFWPF.You should also have an improved understanding of the various types of input events and the routed event mechanisms used by WPFWPF.

Existen recursos adicionales que explican los elementos del marco de trabajo WPFWPF y el enrutamiento de eventos con más detalle.Additional resources are available that explain WPFWPF framework elements and event routing in more detail. Consulte los temas siguientes para obtener más información: Información general sobre comandos, Información general sobre el foco, Información general sobre elementos base, Árboles en WPF e Información general sobre eventos enrutados.See the following overviews for more information, Commanding Overview, Focus Overview, Base Elements Overview, Trees in WPF, and Routed Events Overview.

Vea tambiénSee also