Übersicht über die EingabeInput Overview

Das Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Subsystem bietet eine leistungsstarke API zum Abrufen von Eingaben von einer Vielzahl von Geräten, einschließlich Maus, Tastatur, Fingereingabe und Tablettstift.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. In diesem Thema werden die Dienste beschrieben, die von WPFWPF bereitgestellt werden sowie die Architektur des Eingabesystems.This topic describes the services provided by WPFWPF and explains the architecture of the input systems.

Eingabe-APIInput API

Die primäre Eingabe-API ist in den Basiselement Klassen enthalten: UIElement, ContentElement, FrameworkElementund FrameworkContentElement.The primary input API exposure is found on the base element classes: UIElement, ContentElement, FrameworkElement, and FrameworkContentElement. Weitere Informationen zu den Basiselementen finden Sie unter Übersicht über Basiselemente.For more information about the base elements, see Base Elements Overview. Diese Klassen bieten Funktionen für Eingabeereignisse, die im Zusammenhang mit Tastatureingaben, Maustasten, dem Mausrad, der Bewegung der Maus, der Fokusverwaltung und Mauseingabe stehen, um nur einige zu nennen.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. Durch das Platzieren der Eingabe-API für die Basiselemente, anstatt alle Eingabeereignisse als Dienst zu behandeln, ermöglicht die Eingabe Architektur, dass die Eingabeereignisse von einem bestimmten Objekt in der Benutzeroberfläche stammen und ein Ereignis Routing Schema unterstützen, bei dem mehr als ein Element über einen OPP verfügt. ortunity, um ein Eingabe Ereignis zu behandeln.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. Vielen Eingabeereignissen ist ein Paar von Ereignissen zugeordnet.Many input events have a pair of events associated with them. Beispielsweise ist das KeyDown-Ereignis dem-Ereignis KeyDown und PreviewKeyDown dem-Ereignis zugeordnet.For example, the key down event is associated with the KeyDown and PreviewKeyDown events. Der Unterschied zwischen diesen Ereignissen ist, wie an das Zielelement weitergeleitet werden.The difference in these events is in how they are routed to the target element. Vorschauereignisse tunneln die Elementstruktur vom Stammelement hinunter zum Zielelement.Preview events tunnel down the element tree from the root element to the target element. Bubbling-Ereignisse übergeben vom Zielelement an das Stammelement.Bubbling events bubble up from the target element to the root element. Das Ereignisrouting in WPFWPF wird ausführlicher unten in dieser Übersicht und unter der Übersicht über Routingereignisse behandelt.Event routing in WPFWPF is discussed in more detail later in this overview and in the Routed Events Overview.

Tastatur- und MausklassenKeyboard and Mouse Classes

Zusätzlich zur Eingabe-API in den Basiselement Klassen stellen die- Keyboard Klasse und Mouse die-Klasse zusätzliche API für die Arbeit mit Tastatur-und Maus Eingaben bereit.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.

Beispiele für die Eingabe-API Keyboard für die- Modifiers Klasse sind die-Eigenschaft ModifierKeys , die den derzeit gedrückten zurückgibt, und die IsKeyDown -Methode, die bestimmt, ob eine angegebene Taste gedrückt wird.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.

Im folgenden Beispiel wird die GetKeyStates -Methode verwendet, um Key zu bestimmen, ob sich ein im Zustand "herunter" befindet.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

Beispiele für die Eingabe-API Mouse der- MiddleButtonKlasse sind, die den Zustand der mittleren Maustaste erhält, und DirectlyOver, der das Element abruft, über dem sich der Mauszeiger befindet.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.

Im folgenden Beispiel wird bestimmt, LeftButton ob sich die auf der Maus Pressed im-Zustand befindet.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

Die Mouse Klassen Keyboard und werden in dieser Übersicht ausführlicher behandelt.The Mouse and Keyboard classes are covered in more detail throughout this overview.

StifteingabeStylus Input

WPFWPFverfügt über integrierte Unterstützung Stylusfür.has integrated support for the Stylus. Der Stylus ist eine Stift Eingabe, die von der Tablet PCTablet PCbeliebt gemacht wird.The Stylus is a pen input made popular by the Tablet PCTablet PC. WPFWPFAnwendungen können den Tablettstift mithilfe der Maus-API als Maus behandeln, aber WPFWPF auch eine Stift-Geräte Abstraktion, die ein Modell ähnlich der Tastatur und der Maus verwendet.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. Alle tablettstiftbezogenen APIs enthalten das Wort "Tablettstift".All stylus-related APIs contain the word "Stylus".

Da der Stift als Maus fungieren kann, können Anwendungen, die nur die Mauseingabe unterstützen, noch immer ein gewisses Maß an automatischer Unterstützung für den Stift erhalten.Because the stylus can act as a mouse, applications that support only mouse input can still obtain some level of stylus support automatically. Wenn der Stift auf diese Weise verwendet wird, bekommt die Anwendung die Gelegenheit, das entsprechende Stiftereignis zu behandeln und behandelt dann das entsprechende Mausereignis.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. Darüber hinaus sind Dienste auf höherer Ebene (z.B. Freihandeingabe) noch immer über die Stift-Geräteabstraktion verfügbar.In addition, higher-level services such as ink input are also available through the stylus device abstraction. Weitere Informationen zur Freihandeingabe finden Sie unter Erste Schritte mit Freihandeingaben.For more information about ink as input, see Getting Started with Ink.

EreignisroutingEvent Routing

Eine FrameworkElement kann andere Elemente als untergeordnete Elemente in Ihrem Inhalts Modell enthalten, die eine Struktur von Elementen bilden.A FrameworkElement can contain other elements as child elements in its content model, forming a tree of elements. Durch die Übergabe von Ereignissen kann das übergeordnete Element in WPFWPF in der Eingabe teilnehmen, die an dessen untergeordnetes Element oder andere indirekt untergeordnete Elemente weitergeleitet wird.In WPFWPF, the parent element can participate in input directed to its child elements or other descendants by handing events. Dies ist besonders nützlich, um Steuerelemente aus kleineren Steuerelementen zu erstellen. Dieser Prozess wird als „Zusammensetzung von Steuerelementen“ oder „Zusammensetzen“ bezeichnet.This is especially useful for building controls out of smaller controls, a process known as "control composition" or "compositing." Weitere Informationen über Elementstrukturen und wie sich Elementstrukturen auf Ereignisrouten beziehen, finden Sie unter Strukturen in WPF.For more information about element trees and how element trees relate to event routes, see Trees in WPF.

Das Ereignisrouting ist der Prozess, in dem Ereignisse an mehrere Elemente weitergeleitet werden, sodass ein bestimmtes Objekt oder Element entlang der Route einem Ereignis eine signifikante Antwort (durch Behandlung) anbieten kann, die sonst von einem anderen Element hätte stammen können.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. Routingereignisse verwenden einen von drei Routingmechanismen: direkt, Bubbling und Tunneln.Routed events use one of three routing mechanisms: direct, bubbling, and tunneling. Beim direkten Routing ist das Quellelement das einzige benachrichtigte Element, und das Ereignis wird nicht an andere Elemente weitergeleitet.In direct routing, the source element is the only element notified, and the event is not routed to any other elements. Das direkte Routing Ereignis bietet jedoch noch einige zusätzliche Funktionen, die nur für Routing Ereignisse und nicht für CLR-Standard Ereignisse vorhanden sind.However, the direct routed event still offers some additional capabilities that are only present for routed events as opposed to standard CLR events. Bubbling arbeitet sich in der Elementstruktur nach oben, indem zuerst das Element benachrichtigt wird, von dem das Ereignis stammt, und anschließend das übergeordnete Element usw.Bubbling works up the element tree by first notifying the element that sourced the event, then the parent element, and so on. Tunneling beginnt am Stamm der Elementstruktur, arbeitet sich nach unten und endet mit dem ursprünglichen Quellelement.Tunneling starts at the root of the element tree and works down, ending with the original source element. Weitere Informationen zu Routingereignissen finden Sie unter Übersicht über Routingereignisse.For more information about routed events, see Routed Events Overview.

WPFWPF-Eingabeereignisse treten generell in Paaren auf, die aus einem Tunneling-Ereignis und einem Bubbling-Ereignis bestehen.input events generally come in pairs that consists of a tunneling event and a bubbling event. Tunneling-Ereignisse unterscheiden sich von Bubbling-Ereignissen im Präfix „Preview“.Tunneling events are distinguished from bubbling events with the "Preview" prefix. Beispielsweise MouseMove ist die tunnelingversion eines Maus Verschiebungs Ereignisses und die bubblingerversion dieses Ereignisses. PreviewMouseMoveFor instance, PreviewMouseMove is the tunneling version of a mouse move event and MouseMove is the bubbling version of this event. Diese Ereignispaarung ist eine Konvention, die auf der Elementebene implementiert ist, und keine inhärente Funktion des WPFWPF-Ereignissystems,This event pairing is a convention that is implemented at the element level and is not an inherent capability of the WPFWPF event system. Weitere Informationen finden Sie im Abschnitt „Eingabeereignisse in WPF“ in Übersicht über Routingereignisse.For details, see the WPF Input Events section in Routed Events Overview.

Behandeln von EingabeereignissenHandling Input Events

Um Eingaben für ein Element zu erhalten, muss ein Ereignishandler mit diesem speziellen Ereignis verknüpft sein.To receive input on an element, an event handler must be associated with that particular event. In XAMLXAML ist dies einfach: Sie verweisen auf den Namen des Ereignisses als ein Attribut des Elements, das für dieses Ereignis überwacht.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. Legen Sie anschließend den Wert des Attributs auf den Namen des Ereignishandlers, den Sie basierend auf einen Delegaten definieren, fest.Then, you set the value of the attribute to the name of the event handler that you define, based on a delegate. Der Ereignishandler muss in Code wie geschrieben C# und in einer Code Behind-Datei enthalten sein.The event handler must be written in code such as C# and can be included in a code-behind file.

Tastaturereignisse treten auf, wenn das Betriebssystem Tastaturaktionen meldet, die auftreten, während sich der Tastaturfokus auf einem Element befindet.Keyboard events occur when the operating system reports key actions that occur while keyboard focus is on an element. Maus- und Stiftereignisse lassen sich in zwei Kategorien unterteilen: Ereignisse, die Änderungen der Zeigerposition relativ zum Element melden sowie Ereignisse, die Änderungen im Status der Geräteschaltflächen melden.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.

Beispiel eines TastatureingabeereignissesKeyboard Input Event Example

Das folgende Beispiel überwacht das Drücken der Nach-Links-Taste.The following example listens for a left arrow key press. Eine StackPanel wird erstellt, die über Buttoneine verfügt.A StackPanel is created that has a Button. Ein Ereignishandler, der die nach-links-Taste gedrückt halten soll, Button wird an die Instanz angefügt.An event handler to listen for the left arrow key press is attached to the Button instance.

Im ersten Abschnitt des Beispiels werden StackPanel und der Button erstellt, und KeyDownder-Ereignishandler wird an angefügt.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

Der zweite Abschnitt ist in Code geschrieben und definiert den Ereignishandler.The second section is written in code and defines the event handler. Wenn die nach-links-Taste gedrückt wird Button und der über den Tastaturfokus verfügt, Button wird Background der Handler ausgeführt, und die Farbe des wird geändert.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. Wenn die Taste gedrückt wird, es sich aber nicht um die nach-links- Background Taste handelt, Button wird die Farbe der wieder in die Start Farbe geändert.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

Beispiel für MauseingabeereignisseMouse Input Event Example

Im folgenden Beispiel wird die Background Farbe einer Button geändert, wenn der Mauszeiger in den Buttoneintritt.In the following example, the Background color of a Button is changed when the mouse pointer enters the Button. Die Background Farbe wird wieder hergestellt, wenn die Maus Buttondie verlässt.The Background color is restored when the mouse leaves the Button.

Im ersten Abschnitt StackPanel des Beispiels werden das-Steuerelement und das Button -Steuerelement erstellt und die Ereignis MouseEnter Handler MouseLeave für das- ButtonEreignis und das-Ereignis an den angefügt.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

Der zweite Abschnitt des Beispiels wird in Code geschrieben und definiert die Ereignishandler.The second section of the example is written in code and defines the event handlers. Wenn die Maus in den Buttoneintritt, Background Button wird die Farbe von in SlateGraygeändert.When the mouse enters the Button, the Background color of the Button is changed to SlateGray. Wenn die ButtonMaus den verlässt, Button wird Background die Farbe von wieder in AliceBluegeändert.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

TexteingabeText Input

Das TextInput Ereignis ermöglicht es Ihnen, auf geräteunabhängige Weise auf Texteingaben zu lauschen.The TextInput event enables you to listen for text input in a device-independent manner. Die Tastatur dient primär der Texteingabe, jedoch können Sie auch durch die Sprache, handschriftlich oder mit anderen Eingabegeräten Texteingabe generieren.The keyboard is the primary means of text input, but speech, handwriting, and other input devices can generate text input also.

Für Tastatureingaben WPFWPF sendet zunächst die / entsprechenden KeyDown KeyUp Ereignisse.For keyboard input, WPFWPF first sends the appropriate KeyDown/KeyUp events. Wenn diese Ereignisse nicht behandelt werden und es sich bei dem Schlüssel um einen Text handelt (anstelle eines Steuer Elements, z. b. direktionale Pfeile oder Funktionstasten), wird ein TextInput -Ereignis ausgelöst.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. Zwischen KeyDown dem-Ereignis/ undTextInput dem-Ereignis besteht nicht immer eine einfache 1: Eins-Zuordnung, da mehrere Tastatureingaben ein einzelnes Zeichen von Texteingabe generieren können und einzelne Tastatureingaben mehrere Zeichen generieren können. KeyUp Folgen.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. Dies gilt insbesondere für Sprachen wie Chinesisch, Japanisch und Koreanisch, die Eingabemethoden-Editoren (Input Method Editors, IMEs) verwenden, um Tausende von möglichen Zeichen in den entsprechenden Alphabets zu generieren.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.

Wenn WPFWPF ein KeyUp Key TextInput -Ereignis sendet, wird aufKey.System festgelegt, wenn die Tastatureingaben Teil eines-Ereignisses werden könnten (Wenn z. b. ALT + S gedrückt wird). / KeyDownWhen 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). Dies ermöglicht es dem Code KeyDown in einem Key.System -Ereignishandler, die Verarbeitung des- TextInput Handlers des nachfolgend ausgelössten Ereignisses zu überprüfen und, wenn er gefunden wird.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. In diesen Fällen können die verschiedenen Eigenschaften des TextCompositionEventArgs Arguments verwendet werden, um die ursprünglichen Tastatureingaben zu bestimmen.In these cases, the various properties of the TextCompositionEventArgs argument can be used to determine the original keystrokes. Wenn ein IME aktiv ist, Key hat gleichermaßen den Wert, und ImeProcessedKey gibt die ursprüngliche Tastatureingabe oder Tastatureingaben aus Key.ImeProcessed.Similarly, if an IME is active, Key has the value of Key.ImeProcessed, and ImeProcessedKey gives the original keystroke or keystrokes.

Im folgenden Beispiel wird ein Handler für das Click -Ereignis und ein-Handler KeyDown für das-Ereignis definiert.The following example defines a handler for the Click event and a handler for the KeyDown event.

Das erste Segment des Codes oder Markups erstellt die Benutzeroberfläche.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

Das zweite Segment des Codes enthält die Ereignishandler.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

Da Eingabeereignisse die Ereignis Route aufblasen, StackPanel empfängt die Eingabe unabhängig davon, welches Element den Tastaturfokus besitzt.Because input events bubble up the event route, the StackPanel receives the input regardless of which element has keyboard focus. Das TextBox -Steuerelement wird zuerst benachrichtigt OnTextInputKeyDown , und der-Handler TextBox wird nur aufgerufen, wenn der die Eingabe nicht behandelt hat.The TextBox control is notified first and the OnTextInputKeyDown handler is called only if the TextBox did not handle the input. Wenn das PreviewKeyDown Ereignis anstelle KeyDown des-Ereignisses verwendet wird, wird OnTextInputKeyDown der Handler zuerst aufgerufen.If the PreviewKeyDown event is used instead of the KeyDown event, the OnTextInputKeyDown handler is called first.

In diesem Beispiel wird die Behandlungslogik zweimal geschrieben: einmal für STRG+O und nochmal für das Click-Ereignis der Schaltfläche.In this example, the handling logic is written two times—one time for CTRL+O, and again for button's click event. Anstatt die Eingabeereignisse direkt zu behandeln, können Sie dies mithilfe von Befehlen vereinfachen.This can be simplified by using commands, instead of handling the input events directly. Befehle werden in dieser Übersicht unter Befehlsübersicht erläutert.Commands are discussed in this overview and in Commanding Overview.

Fingereingabe (Touch) und-BearbeitungTouch and Manipulation

Neue Hardware und API im Windows 7-Betriebssystem bieten Anwendungen die Möglichkeit, Eingabe von mehreren Berührungen gleichzeitig zu erhalten.New hardware and API in the Windows 7 operating system provide applications the ability to receive input from multiple touches simultaneously. WPFWPF ermöglicht Anwendungen, Fingereingabe zu erkennen und ähnlich wie auf andere Eingabe zu reagieren, z.B. von einer Maus oder einer Tastatur, durch Auslösen von Ereignissen, wenn eine Fingereingabe erfolgt.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 macht zwei Typen von Ereignissen verfügbar, wenn eine Fingereingabe erfolgt: Berührungsereignisse und Bearbeitungsereignisse.exposes two types of events when touch occurs: touch events and manipulation events. Berührungsereignisse stellen Rohdaten zu jedem Finger auf einem Touchscreen und seiner Bewegung bereit.Touch events provide raw data about each finger on a touchscreen and its movement. Bearbeitungsereignisse interpretieren die Eingabe als bestimmte Aktionen.Manipulation events interpret the input as certain actions. Beide Typen von Ereignissen werden in diesem Abschnitt erläutert.Both types of events are discussed in this section.

VorraussetzungenPrerequisites

Sie benötigen die folgenden Komponenten zur Entwicklung einer Anwendung, die auf Fingereingabe reagiert.You need the following components to develop an application that responds to touch.

  • Visual Studio 2010.Visual Studio 2010.

  • Windows 7Windows 7.

  • Ein Gerät, z.B. ein Touchscreen, das Windows Touch unterstütztA device, such as a touchscreen, that supports Windows Touch.

TerminologieTerminology

Die folgenden Begriffe werden verwendet, wenn die Fingereingabe behandelt wird.The following terms are used when touch is discussed.

  • Touch (Fingereingabe) ist ein Typ von Benutzereingabe, der von Windows 7 erkannt wird.Touch is a type of user input that is recognized by Windows 7. In der Regel wird die Fingereingabe initiiert, indem ein berührungsempfindlicher Bildschirm mit Fingern berührt wird.Usually, touch is initiated by putting fingers on a touch-sensitive screen. Beachten Sie, dass Geräte wie Touchpads, die auf Laptops gang und gäbe sind, keine Fingereingabe unterstützen, wenn das Gerät lediglich die Position und die Bewegung des Fingers als Mauseingabe konvertiert.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 (Mehrfingereingabe) ist Berührung, die gleichzeitig von mehreren Punkten erfolgt.Multitouch is touch that occurs from more than one point simultaneously. Windows 7 und WPFWPF unterstützen die Mehrfingereingabe.Windows 7 and WPFWPF supports multitouch. Wann immer die Fingereingabe in der Dokumentation für WPFWPF erläutert wird, gelten die Konzepte auch für die Mehrfingereingabe.Whenever touch is discussed in the documentation for WPFWPF, the concepts apply to multitouch.

  • Ein Manipulation tritt auf, wenn die Berührung als physische Aktion interpretiert wird, die auf ein Objekt angewendet wird.A manipulation occurs when touch is interpreted as a physical action that is applied to an object. In WPFWPF interpretieren Bearbeitungsereignisse die Eingabe als Übersetzungs-, Erweiterungs- und Drehungsmanipualtion.In WPFWPF, manipulation events interpret input as a translation, expansion, or rotation manipulation.

  • Ein touch device stellt ein Gerät dar, das Fingereingabe erzeugt, z.B. ein einzelner Finger auf einem Touchscreen.A touch device represents a device that produces touch input, such as a single finger on a touchscreen.

Steuerelemente, die auf Fingereingabe reagierenControls that Respond to Touch

Die folgenden Steuerelemente können gescrollt werden, wenn Sie über Inhalt verfügen, der sich außerhalb der Ansicht befindet, indem Sie mit einem Finger über die Steuerelemente wischen.The following controls can be scrolled by dragging a finger across the control if it has content that is scrolled out of view.

Definiert ScrollViewer dieScrollViewer.PanningMode angefügte-Eigenschaft, mit der Sie angeben können, ob die Berührungs schwenken horizontal, vertikal, beides oder keines von beiden aktiviert ist.The ScrollViewer defines the ScrollViewer.PanningMode attached property that enables you to specify whether touch panning is enabled horizontally, vertically, both, or neither. Die ScrollViewer.PanningDeceleration -Eigenschaft gibt an, wie schnell der Bildlauf verlangsamt wird, wenn der Benutzer den Finger vom Touchscreen aufhebt.The ScrollViewer.PanningDeceleration property specifies how quickly the scrolling slows down when the user lifts the finger from the touchscreen. Die ScrollViewer.PanningRatio angefügte-Eigenschaft gibt das Verhältnis des scrolloffsets zum Übersetzen der Manipulations Abweichung an.The ScrollViewer.PanningRatio attached property specifies the ratio of scrolling offset to translate manipulation offset.

BerührungsereignisseTouch Events

Die Basisklassen UIElement UIElement3D,, und ContentElementdefinieren Ereignisse, die Sie abonnieren können, damit Ihre Anwendung auf die Fingereingabe reagiert.The base classes, UIElement, UIElement3D, and ContentElement, define events that you can subscribe to so your application will respond to touch. Berührungsereignisse sind nützlich, wenn Ihre Anwendung Fingereingabe als etwas anderes als die Bearbeitung eines Objekts interpretiert.Touch events are useful when your application interprets touch as something other than manipulating an object. Beispielsweise würde eine Anwendung, mit der ein Benutzer mit einem oder mehreren Fingern zeichnen kann, Berührungsereignisse abonnieren.For example, an application that enables a user to draw with one or more fingers would subscribe to touch events.

Alle drei Klassen definieren die folgenden Ereignisse, die sich ähnlich verhalten, unabhängig von der definierenden Klasse.All three classes define the following events, which behave similarly, regardless of the defining class.

Wie die Tastatur- und Maus-Ereignisse sind die Berührungsereignisse Routingereignisse.Like keyboard and mouse events, the touch events are routed events. Die Ereignisse, die mit Preview beginnen, sind Tunneling-Ereignisse, und die Ereignisse, die mit Touch beginnen, sind Bubbling-Ereignisse.The events that begin with Preview are tunneling events and the events that begin with Touch are bubbling events. Weitere Informationen zu Routingereignissen finden Sie unter Übersicht über Routingereignisse.For more information about routed events, see Routed Events Overview. Wenn Sie diese Ereignisse behandeln, können Sie die Position der Eingabe relativ zu einem beliebigen Element abrufen, indem Sie die- GetTouchPoint Methode GetIntermediateTouchPoints oder die-Methode aufrufen.When you handle these events, you can get the position of the input, relative to any element, by calling the GetTouchPoint or GetIntermediateTouchPoints method.

Um die Interaktion zwischen Berührungsereignissen zu verstehen, denken Sie an das Szenario, bei dem ein Benutzer einen Finger auf ein Element legt, den Finger im Element bewegt und anschließend den Finger vom Element wegnimmt.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. Die folgende Abbildung zeigt die Ausführung der Bubbling-Ereignisse (die Tunneling-Ereignisse werden der Einfachheit halber ausgelassen).The following illustration shows the execution of the bubbling events (the tunneling events are omitted for simplicity).

Die Sequenz von Berührungs Ereignissen. Berührungs EreignisseThe sequence of touch events. Touch events

Die folgende Liste beschreibt die Abfolge der Ereignisse in der vorherigen Abbildung.The following list describes the sequence of the events in the preceding illustration.

  1. Das TouchEnter Ereignis tritt einmal auf, wenn der Benutzer einen Finger auf das Element legt.The TouchEnter event occurs one time when the user puts a finger on the element.

  2. Das TouchDown Ereignis tritt einmal auf.The TouchDown event occurs one time.

  3. Das TouchMove Ereignis tritt mehrmals auf, wenn der Benutzer den Finger im Element bewegt.The TouchMove event occurs multiple times as the user moves the finger within the element.

  4. Das TouchUp Ereignis tritt einmal auf, wenn der Benutzer den Finger vom Element aufhebt.The TouchUp event occurs one time when the user lifts the finger from the element.

  5. Das TouchLeave Ereignis tritt einmal auf.The TouchLeave event occurs one time.

Wenn mehr als zwei Finger verwendet werden, treten die Ereignisse für jeden Finger auf.When more than two fingers are used, the events occur for each finger.

BearbeitungsereignisseManipulation Events

In Fällen, in denen eine Anwendung einem Benutzer das Bearbeiten eines Objekts ermöglicht UIElement , definiert die Klasse Bearbeitungs Ereignisse.For cases where an application enables a user to manipulate an object, the UIElement class defines manipulation events. Im Gegensatz zu den Berührungsereignissen, die einfach die Position der Berührung melden, melden die Bearbeitungsereignisse, wie die Eingabe interpretiert werden kann.Unlike the touch events that simply report the position of touch, the manipulation events report how the input can be interpreted. Es gibt drei Arten von Manipulationen, Übersetzung, Erweiterung und Drehung.There are three types of manipulations, translation, expansion, and rotation. Die folgende Liste beschreibt, wie die drei Typen von Manipulationen aufgerufen werden.The following list describes how to invoke the three types of manipulations.

  • Legen Sie einen Finger auf ein Objekt, und verschieben Sie den Finger über den Touchscreen, um eine Übersetzungsmanipulation aufzurufen.Put a finger on an object and move the finger across the touchscreen to invoke a translation manipulation. Dadurch wird in der Regel das Objekt verschoben.This usually moves the object.

  • Legen Sie zwei Finger auf ein Objekt, und bewegen Sie die Finger näher zusammen oder weiter auseinander, um eine Erweiterungsmanipulation aufzurufen.Put two fingers on an object and move the fingers closer together or farther apart from one another to invoke an expansion manipulation. Dadurch wird in der Regel die Größe des Objekts geändert.This usually resizes the object.

  • Legen Sie zwei Finger auf ein Objekt, und drehen Sie einen Finger um den jeweils anderen um eine Drehungsmanipulation aufzurufen.Put two fingers on an object and rotate the fingers around each other to invoke a rotation manipulation. Dadurch wird in der Regel das Objekt gedreht.This usually rotates the object.

Es kann mehr als eine Manipulation gleichzeitig geschehen.More than one type of manipulation can occur simultaneously.

Wenn Sie Objekte dazu bringen, auf Manipulationen anzusprechen, können Sie erreichen, dass das Objekt verzögert wird.When you cause objects to respond to manipulations, you can have the object appear to have inertia. Dadurch kann Ihr Objekt die physische Welt simulieren.This can make your objects simulate the physical world. Wenn Sie z.B. ein Buch über einen Tisch schieben, dann bewegt sich das Buch nach dem Loslassen weiter voran, wenn Sie nur kräftig genug anschieben.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. Mit WPFWPF können Sie dieses Verhalten übernehmen, indem Sie Bearbeitungsereignisse auslösen,nachdem der Benutzer das Objekt losgelassen hat.WPFWPF enables you to simulate this behavior by raising manipulation events after the user's fingers releases the object.

Weitere Informationen zum Erstellen einer Anwendung, die dem Benutzer das Verschieben, Ändern der Größe und das Drehen eines Objekts ermöglicht, finden Sie unter Exemplarische Vorgehensweise: Erstellen Ihrer ersten Touchscreen-Anwendung.For information about how to create an application that enables the user to move, resize, and rotate an object, see Walkthrough: Creating Your First Touch Application.

UIElement Definiert die folgenden Bearbeitungs Ereignisse.The UIElement defines the following manipulation events.

Standardmäßig empfängt eine UIElement diese Manipulations Ereignisse nicht.By default, a UIElement does not receive these manipulation events. Legen Sie UIElement UIElement.IsManipulationEnabledauffest , um Bearbeitungs Ereignisse für eine zu empfangen. trueTo receive manipulation events on a UIElement, set UIElement.IsManipulationEnabled to true.

Der Ausführungspfad von BearbeitungsereignissenThe Execution Path of Manipulation Events

Denken Sie an ein Szenario, in dem ein Benutzer ein Objekt „wirft“.Consider a scenario where a user "throws" an object. Der Benutzer legt einen Finger auf das Objekt, bewegt den Finger etwas über den Touchscreen und hebt dann in der Bewegung den Finger.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. Dadurch bewegt sich das Objekt unter dem Finger des Benutzers und bewegt sich dann noch weiter, wenn der Benutzer den Finger hebt.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.

Die folgende Abbildung zeigt den Ausführungspfad von Bearbeitungsereignissen und wichtige Informationen zu jedem Ereignis.The following illustration shows the execution path of manipulation events and important information about each event.

Die Sequenz der Bearbeitungs Ereignisse. Manipulations EreignisseThe sequence of manipulation events. Manipulation events

Die folgende Liste beschreibt die Abfolge der Ereignisse in der vorherigen Abbildung.The following list describes the sequence of the events in the preceding illustration.

  1. Das ManipulationStarting Ereignis tritt auf, wenn der Benutzer einen Finger auf das Objekt legt.The ManipulationStarting event occurs when the user places a finger on the object. Unter anderem ermöglicht dieses Ereignis das Festlegen der ManipulationContainer -Eigenschaft.Among other things, this event allows you to set the ManipulationContainer property. In den nachfolgenden Ereignissen ist die Position der Bearbeitung relativ zum ManipulationContainer.In the subsequent events, the position of the manipulation will be relative to the ManipulationContainer. In anderen Ereignissen als ManipulationStartingist diese Eigenschaft schreibgeschützt, sodass das ManipulationStarting Ereignis das einzige Mal ist, dass Sie diese Eigenschaft festlegen können.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. Das ManipulationStarted Ereignis tritt als nächstes auf.The ManipulationStarted event occurs next. Dieses Ereignis meldet den Ursprung der Manipulation.This event reports the origin of the manipulation.

  3. Das ManipulationDelta Ereignis tritt mehrmals auf, wenn die Finger des Benutzers auf einem Touchscreen bewegt werden.The ManipulationDelta event occurs multiple times as a user's fingers move on a touchscreen. Die DeltaManipulation -Eigenschaft ManipulationDeltaEventArgs der-Klasse meldet, ob die Manipulation als Bewegung, Erweiterung oder Übersetzung interpretiert wird.The DeltaManipulation property of the ManipulationDeltaEventArgs class reports whether the manipulation is interpreted as movement, expansion, or translation. Hier können Sie die meisten Bearbeitungen an einem Objekt durchführen.This is where you perform most of the work of manipulating an object.

  4. Das ManipulationInertiaStarting Ereignis tritt auf, wenn die Finger des Benutzers den Kontakt mit dem Objekt verlieren.The ManipulationInertiaStarting event occurs when the user's fingers lose contact with the object. Mit diesem Ereignis können Sie die Verlangsamung der Bearbeitungen während der Verzögerung angeben.This event enables you to specify the deceleration of the manipulations during inertia. So kann Ihr Objekt unterschiedliche physikalische Bereiche oder Attribute Ihrer Wahl emulieren.This is so your object can emulate different physical spaces or attributes if you choose. Nehmen wir beispielsweise an, Ihre Anwendung enthält zwei Objekte, die Elemente in der realen Welt darstellen, und eines massiger als das andere ist.For example, suppose your application has two objects that represent items in the physical world, and one is heavier than the other. Sie können veranlassen, dass das massige Objekt schneller verlangsamt wird als das leichtere ObjektYou can make the heavier object decelerate faster than the lighter object.

  5. Das ManipulationDelta Ereignis tritt mehrmals auf, wenn Trägheit auftritt.The ManipulationDelta event occurs multiple times as inertia occurs. Beachten Sie, dass dieses Ereignis auftritt, wenn der Benutzer seine Finger über den Touchscreen bewegt, und wenn WPFWPF Verzögerung simuliert.Note that this event occurs when the user's fingers move across the touchscreen and when WPFWPF simulates inertia. Anders ausgedrückt, ManipulationDelta tritt vor und nach dem ManipulationInertiaStarting -Ereignis auf.In other words, ManipulationDelta occurs before and after the ManipulationInertiaStarting event. Die ManipulationDeltaEventArgs.IsInertial -Eigenschaft meldet, ManipulationDelta ob das Ereignis während der Trägheit auftritt, sodass Sie diese Eigenschaft überprüfen und abhängig von ihrem Wert verschiedene Aktionen ausführen können.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. Das ManipulationCompleted Ereignis tritt auf, wenn die Manipulation und Trägheit beendet werden.The ManipulationCompleted event occurs when the manipulation and any inertia ends. Das heißt, nachdem alle ManipulationDelta Ereignisse aufgetreten sind, tritt das ManipulationCompleted -Ereignis auf, um zu signalisieren, dass die Bearbeitung vollständig ist.That is, after all the ManipulationDelta events occur, the ManipulationCompleted event occurs to signal that the manipulation is complete.

Der UIElement definiert auch das ManipulationBoundaryFeedback Ereignis.The UIElement also defines the ManipulationBoundaryFeedback event. Dieses Ereignis tritt ManipulationDelta auf, ReportBoundaryFeedback wenn die-Methode im-Ereignis aufgerufen wird.This event occurs when the ReportBoundaryFeedback method is called in the ManipulationDelta event. Das ManipulationBoundaryFeedback -Ereignis ermöglicht Anwendungen oder Komponenten das Bereitstellen von visuellem Feedback, wenn ein Objekt auf eine Grenze trifft.The ManipulationBoundaryFeedback event enables applications or components to provide visual feedback when an object hits a boundary. Die Window -Klasse verarbeitet z. b ManipulationBoundaryFeedback . das-Ereignis, um zu bewirken, dass das Fenster beim Auftreten seines Edge leicht verschoben wird.For example, the Window class handles the ManipulationBoundaryFeedback event to cause the window to slightly move when its edge is encountered.

Sie können die Bearbeitung abbrechen, indem Sie Cancel die-Methode für die Ereignis Argumente in einem beliebigen ManipulationBoundaryFeedback Manipulations Ereignis außer Ereignis aufrufen.You can cancel the manipulation by calling the Cancel method on the event arguments in any manipulation event except ManipulationBoundaryFeedback event. Wenn Sie aufzurufen Cancel, werden die Manipulations Ereignisse nicht mehr ausgelöst, und es treten Mausereignisse für die Fingereingabe auf.When you call Cancel, the manipulation events are no longer raised and mouse events occur for touch. Die folgende Tabelle beschreibt die Beziehung zwischen dem Zeitpunkt, an dem die Bearbeitung abgebrochen wird, und den Mausereignissen, die auftreten.The following table describes the relationship between the time the manipulation is canceled and the mouse events that occur.

Das Ereignis zum Abbruch, das aufgerufen wirdThe event that Cancel is called in Die Mausereignisse, die für die Eingabe auftreten, die bereits aufgetreten sindThe mouse events that occur for input that already occurred
ManipulationStarting und ManipulationStartedManipulationStarting and ManipulationStarted Ereignisse mit gedrückter MaustasteMouse down events.
ManipulationDelta Ereignisse mit gedrückter Maustaste und beim Verschieben der MausMouse down and mouse move events.
ManipulationInertiaStarting und ManipulationCompletedManipulationInertiaStarting and ManipulationCompleted Ereignisse mit gedrückter Maustaste, beim Verschieben der Maus und beim Loslassen der MaustasteMouse down, mouse move, and mouse up events.

Beachten Sie, dass die Cancel -Methode zurückgibt, wenn Sie bei einer Trägheit false -Bearbeitung den Wert zurückgeben und die Eingabe keine Mausereignisse aufruft.Note that if you call Cancel when the manipulation is in inertia, the method returns false and the input does not raise mouse events.

Die Beziehung zwischen Berührungs- und BearbeitungsereignissenThe Relationship Between Touch and Manipulation Events

Ein UIElement kann immer Berührungs Ereignisse empfangen.A UIElement can always receive touch events. Wenn die IsManipulationEnabled -Eigenschaft auf truefestgelegt ist UIElement , kann ein sowohl Berührungs-als auch Bearbeitungs Ereignisse empfangen.When the IsManipulationEnabled property is set to true, a UIElement can receive both touch and manipulation events. Wenn das TouchDown -Ereignis nicht behandelt wird (d. h Handled . die false-Eigenschaft ist), erfasst die Bearbeitungs Logik die Fingereingabe für das-Element und generiert die Manipulations Ereignisse.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. Wenn die Handled -Eigenschaft im TouchDown - true Ereignis auf festgelegt wird, generiert die Bearbeitungs Logik keine Bearbeitungs Ereignisse.If the Handled property is set to true in the TouchDown event, the manipulation logic does not generate manipulation events. Die folgende Abbildung zeigt die Beziehung zwischen Berührungs- und Bearbeitungsereignissen.The following illustration shows the relationship between touch events and manipulation events.

Beziehung zwischen Berührungs-und Bearbeitungs Ereignissen Berührungs-und Bearbeitungs EreignisseRelationship between touch and manipulation events Touch and manipulation events

Die folgende Liste beschreibt die Beziehung zwischen Berührungs- und Bearbeitungsereignissen, die in der folgenden Abbildung dargestellt ist.The following list describes the relationship between the touch and manipulation events that is shown in the preceding illustration.

FokusFocus

Es gibt zwei Hauptkonzepte, die den Fokus in WPFWPF betreffen: Tastaturfokus und logischer Fokus.There are two main concepts that pertain to focus in WPFWPF: keyboard focus and logical focus.

TastaturfokusKeyboard Focus

Der Tastaturfokus bezieht sich auf das Element, das Tastatureingaben empfängt.Keyboard focus refers to the element that is receiving keyboard input. Es kann nur ein Element auf dem gesamten Desktop geben, das über den Tastaturfokus verfügt.There can be only one element on the whole desktop that has keyboard focus. In WPFWPF wirddasElement,truedas über den Tastaturfokus verfügt, auf festgelegt.IsKeyboardFocusedIn WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. Die statische Keyboard - FocusedElement Methode gibt das Element zurück, das derzeit über den Tastaturfokus verfügt.The static Keyboard method FocusedElement returns the element that currently has keyboard focus.

Der Tastaturfokus kann durch die Tab-Taste für ein Element oder durch Klicken auf die Maus auf bestimmte Elemente (z TextBox. b.) abgerufen werden.Keyboard focus can be obtained by tabbing to an element or by clicking the mouse on certain elements, such as a TextBox. Der Tastaturfokus kann auch Programm gesteuert mithilfe der Focus -Methode für die Keyboard -Klasse abgerufen werden.Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Focusversucht, dem angegebenen Element Tastaturfokus zu übergeben.Focus attempts to give the specified element keyboard focus. Das von Focus zurückgegebene Element ist das Element, das derzeit über den Tastaturfokus verfügt.The element returned by Focus is the element that currently has keyboard focus.

Damit ein Element den Tastaturfokus erhält, müssen die Focusable -Eigenschaft und IsVisible die-Eigenschaften auf truefestgelegt werden.In order for an element to obtain keyboard focus the Focusable property and the IsVisible properties must be set to true. Einige Klassen, wie z Panel. b Focusable ., false haben standardmäßig auf festgelegt. Daher müssen Sie diese Eigenschaft möglich true erweise auf festlegen, wenn dieses Element den Fokus erhalten soll.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.

Im folgenden Beispiel wird Focus verwendet, um den Tastaturfokus Buttonauf einen festzulegen.The following example uses Focus to set keyboard focus on a Button. Die empfohlene Stelle zum Festlegen des ersten Fokus in einer Anwendung ist der Loaded -Ereignishandler.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

Weitere Informationen über den Tastaturfokus finden Sie unter Fokus – Übersicht.For more information about keyboard focus, see Focus Overview.

Logischer FokusLogical Focus

Der logische Fokus bezieht sich FocusManager.FocusedElement auf den in einem Fokusbereich.Logical focus refers to the FocusManager.FocusedElement in a focus scope. Es können mehrere Elemente vorhanden sein, die über logischen Fokus in einer Anwendung verfügen, jedoch kann es nur ein Element geben, das den logischen Fokus in einem bestimmten Fokusbereich besitzt.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.

Ein Fokusbereich ist ein Containerelement, das den FocusedElement innerhalb seines Bereichs verfolgt.A focus scope is a container element that keeps track of the FocusedElement within its scope. Wenn der Fokus einen Fokusbereich verlässt, wird das Element den Tastaturfokus verlieren, jedoch behält es den logischen Fokus.When focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. Wenn der Fokus zum Fokusbereich zurückkehrt, wird das Fokuselement Tastaturfokus erhalten.When focus returns to the focus scope, the focused element will obtain keyboard focus. Somit kann der Tastaturfokus zwischen mehreren Fokusbereichen geändert werden, aber es wird sichergestellt, dass das Fokuselement im Fokusbereich das Element bleibt, das über den Fokus verfügt, wenn dieser zurückgegeben wird.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.

Ein Element kann in einen Fokusbereich in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) umgewandelt werden, indem die FocusManager angefügte-Eigenschaft IsFocusScope auf truefestgelegt wird, oder im Code durch Festlegen der SetIsFocusScope angefügten-Eigenschaft mithilfe der-Methode.An element can be turned into a focus scope in Extensible Application Markup Language (XAML)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.

Im folgenden Beispiel wird ein StackPanel durch Festlegen der IsFocusScope angefügten-Eigenschaft in einen Fokusbereich umgewandelt.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)

Klassen, WPFWPF bei denen es sich standardmäßig um Schwerpunkt MenuBereiche handelt, ContextMenusind Window,, ToolBarund.Classes in WPFWPF which are focus scopes by default are Window, Menu, ToolBar, and ContextMenu.

Ein Element, das über den Tastaturfokus verfügt, weist auch den logischen Fokus auf den Fokusbereich auf, zu dem er gehört. Daher wird beim Festlegen des Fokus auf ein Element Focus , das die Keyboard -Methode für die Klasse oder die Basiselement Klassen verwendet, versucht, dem Element Tastaturfokus und logischen Fokus zu übergeben.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.

Verwenden GetFocusedElementSie, um das fokussierte Element in einem Fokusbereich zu ermitteln.To determine the focused element in a focus scope, use GetFocusedElement. Verwenden SetFocusedElementSie, um das fokussierte Element für einen Fokusbereich zu ändern.To change the focused element for a focus scope, use SetFocusedElement.

Weitere Informationen über den logischen Fokus finden Sie unter Fokus – Übersicht.For more information about logical focus, see Focus Overview.

MauspositionMouse Position

Die WPFWPF Eingabe-API bietet hilfreiche Informationen in Bezug auf Koordinaten Bereiche.The WPFWPF input API provides helpful information with regard to coordinate spaces. Zum Beispiel ist die Koordinate (0,0) die Koordinate oben links, aber von welchem Element in der Struktur?For example, coordinate (0,0) is the upper-left coordinate, but the upper-left of which element in the tree? Das Element, das das Eingabeziel ist?The element that is the input target? Das Element, an das Sie Ihren Ereignishandler angefügt haben?The element you attached your event handler to? Oder doch etwas anderes?Or something else? Um Verwirrung zu vermeiden, WPFWPF erfordert die Eingabe-API, dass Sie den Verweis Rahmen angeben, wenn Sie mit Koordinaten arbeiten, die mit der Maus abgerufen wurden.To avoid confusion, the WPFWPF input API requires that you specify your frame of reference when you work with coordinates obtained through the mouse. Die GetPosition -Methode gibt die Koordinate des Mauszeigers relativ zum angegebenen Element zurück.The GetPosition method returns the coordinate of the mouse pointer relative to the specified element.

MausaufzeichnungMouse Capture

Insbesondere Mausgeräte verfügen über modale Eigenschaften, die als Mausaufzeichnung bekannt sind.Mouse devices specifically hold a modal characteristic known as mouse capture. Die Mausaufzeichnung wird verwendet, um einen vorübergehenden Eingabestatus beizubehalten, wenn ein Drag & Drop-Vorgang gestartet wird, damit andere Vorgänge, einschließlich die nominale Position auf dem Bildschirm, nicht unbedingt auftreten.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. Während des Ziehens kann der Benutzer nicht klicken, ohne dass der Drag & Drop-Vorgang abgebrochen wird. Darum sind die meisten Mouseover-Cues nicht geeignet, während die Mausaufzeichnung durch die Drag-Quelle gehalten wird.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. Das Eingabe System macht APIs verfügbar, mit denen der Status der Maus Aufzeichnung bestimmt werden kann, sowie APIs, mit denen die Maus Aufzeichnung an ein bestimmtes Element erzwungen oder der Zustand der Maus Aufzeichnung gelöscht werden kann.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. Weitere Informationen zu Drag & Drop-Vorgängen finden Sie unter Übersicht über Drag & Drop.For more information on drag-and-drop operations, see Drag and Drop Overview.

BefehleCommands

Befehle ermöglichen die Eingabebehandlung auf einer eher semantischeren Ebene als die Geräteeingabe.Commands enable input handling at a more semantic level than device input. Befehle sind einfache Direktive, wie etwa Cut, Copy, Paste oder Open.Commands are simple directives, such as Cut, Copy, Paste, or Open. Befehle sind nützlich für die Zentralisierung der Befehlslogik.Commands are useful for centralizing your command logic. Auf denselben Befehl kann von einem Menu, auf einem ToolBaroder über eine Tastenkombination zugegriffen werden.The same command might be accessed from a Menu, on a ToolBar, or through a keyboard shortcut. Befehle stellen außerdem einen Mechanismus zum Deaktivieren von Steuerelementen bereit, wenn der Befehl nicht verfügbar ist.Commands also provide a mechanism for disabling controls when the command becomes unavailable.

RoutedCommandist die WPFWPF Implementierung von ICommand.RoutedCommand is the WPFWPF implementation of ICommand. Wenn eine RoutedCommand ausgeführt wird, werden PreviewExecuted ein- Executed Ereignis und ein-Ereignis für das Befehls Ziel ausgelöst, das den Tunnel und die-Elementstruktur durchläuft, wie andere Eingaben.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. Wenn ein Befehlsziel nicht festgelegt ist, wird das Element mit dem Tastaturfokus das Befehlsziel sein.If a command target is not set, the element with keyboard focus will be the command target. Die Logik, die den Befehl ausführt, wird an CommandBindingeinen angefügt.The logic that performs the command is attached to a CommandBinding. Wenn ein CommandBinding ExecutedRoutedEventHandler Ereignis einen für diesen bestimmten Befehl erreicht, wird der auf CommandBinding dem aufgerufen. ExecutedWhen an Executed event reaches a CommandBinding for that specific command, the ExecutedRoutedEventHandler on the CommandBinding is called. Dieser Handler führt die Aktion des Befehls aus.This handler performs the action of the command.

Weitere Informationen über Befehle finden Sie unter Befehlsübersicht.For more information on commanding, see Commanding Overview.

WPFWPFstellt eine Bibliothek allgemeiner Befehle bereit, die aus ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommandsund EditingCommandsbesteht, oder Sie können eigene Befehle definieren.provides a library of common commands which consists of ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, and EditingCommands, or you can define your own.

Im folgenden Beispiel wird MenuItem gezeigt, wie ein eingerichtet wird, sodass beim Klicken auf den- Paste Befehl im aufgerufen TextBoxwird, vorausgesetzt, TextBox dass über den Tastaturfokus verfügt.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

Weitere Informationen über Befehle in WPFWPF finden Sie unter Befehlsübersicht.For more information about commands in WPFWPF, see Commanding Overview.

Das Eingabesystem und die BasiselementeThe Input System and Base Elements

Eingabeereignisse, wie z. b. die angefügten KeyboardEreignisse, Stylus die durch die MouseKlassen, und definiert werden, werden vom Eingabe System ausgelöst und in eine bestimmte Position im Objektmodell eingefügt, basierend auf dem Treffer Test der visuellen Struktur zur Laufzeit.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.

Jedes Ereignis, das Mouse, und Keyboard Stylus als angefügtes Ereignis definiert, wird auch von den Basiselement Klassen UIElement und ContentElement als neues Routing Ereignis erneut verfügbar gemacht.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. Die Basiselement-Routingereignisse werden von Klassen generiert, die das ursprüngliche angefügte Ereignis behandeln und die Ereignisdaten wiederverwenden.The base element routed events are generated by classes handling the original attached event and reusing the event data.

Wenn das Eingabeereignis einem bestimmten Quellelement durch seine Implementierung des Eingabeereignisses des Basiselements zugeordnet wird, kann es durch den Rest einer Ereignisroute weitergeleitet werden, die auf einer Kombination von logischen und visuellen Strukturobjekten basiert und vom Anwendungscode behandelt wird.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. Im Allgemeinen ist es einfacher, diese gerätebezogenen Eingabeereignisse mithilfe der Routing Ereignisse für UIElement und ContentElementzu verarbeiten, da Sie eine intuitivere Ereignishandlersyntax sowohl XAMLXAML in als auch in Code verwenden können.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. Sie könnten stattdessen das angefügte Ereignis behandeln, das den Prozess initiiert hat, jedoch würden Sie auf Probleme stoßen: das angefügte Ereignis kann möglicherweise durch die Behandlung der Basiselementklasse behandelt markiert werden, und Sie müssen Accessormethoden verwenden, anstatt die richtige Ereignissyntax, um Handler für angefügte Ereignisse anzufügen.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.

Weitere InformationenWhat's Next

Sie kennen nun verschiedene Methoden, um Eingabe in WPFWPF zu behandeln.You now have several techniques to handle input in WPFWPF. Sie sollten auch ein tieferes Verständnis der verschiedenen Typen von Eingabeereignissen und Routingereignismechanismen haben, die von WPFWPF genutzt werden.You should also have an improved understanding of the various types of input events and the routed event mechanisms used by WPFWPF.

Es gibt zusätzliche Ressourcen, die WPFWPF-Frameworkelemente und das Ereignisrouting detaillierter beschreiben.Additional resources are available that explain WPFWPF framework elements and event routing in more detail. In den folgenden Übersichten finden Sie weitere Informationen: Befehlsübersicht, Fokus – Übersicht, Übersicht über Basiselemente, Strukturen in WPF und Übersicht über Routingereignisse.See the following overviews for more information, Commanding Overview, Focus Overview, Base Elements Overview, Trees in WPF, and Routed Events Overview.

Siehe auchSee also