入力の概要Input Overview

@No__t-1 サブシステムは、マウス、キーボード、タッチ、スタイラスなど、さまざまなデバイスからの入力を取得するための強力な API を提供します。The Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) subsystem provides a powerful API for obtaining input from a variety of devices, including the mouse, keyboard, touch, and stylus. このトピックでは、WPFWPF で提供されるサービスと、入力システムのアーキテクチャについて説明します。This topic describes the services provided by WPFWPF and explains the architecture of the input systems.

入力 APIInput API

プライマリ入力 API の露出は、基本要素クラス (UIElementContentElementFrameworkElement、および FrameworkContentElement) にあります。The primary input API exposure is found on the base element classes: UIElement, ContentElement, FrameworkElement, and FrameworkContentElement. 基本要素の詳細については、「基本要素の概要」を参照してください。For more information about the base elements, see Base Elements Overview. これらのクラスは、キー操作、マウス ボタン、マウス ホイール、マウス動作、フォーカス管理、マウス キャプチャなどに関連する入力イベントの機能を提供しています。These classes provide functionality for input events related to key presses, mouse buttons, mouse wheel, mouse movement, focus management, and mouse capture, to name a few. 入力アーキテクチャでは、すべての入力イベントをサービスとして扱うのではなく、基本要素に入力 API を配置することで、入力イベントを UI 内の特定のオブジェクトによって供給され、複数の要素が opp を持つイベントルーティングスキームをサポートすることができます。入力イベントを処理します。By placing the input API on the base elements, rather than treating all input events as a service, the input architecture enables the input events to be sourced by a particular object in the UI, and to support an event routing scheme whereby more than one element has an opportunity to handle an input event. 多くの入力イベントには、それぞれに関連付けられたペアとなるイベントがあります。Many input events have a pair of events associated with them. たとえば、キー ダウンのイベントには、KeyDownPreviewKeyDownイベントが関連付けられています。For example, the key down event is associated with the KeyDown and PreviewKeyDown events. これらのイベントは、ターゲット要素にルーティングされる方法が異なります。The difference in these events is in how they are routed to the target element. プレビュー イベントは、ルート要素からターゲット要素へ、要素ツリーを下位に向かいます (トンネル)。Preview events tunnel down the element tree from the root element to the target element. バブル イベントは、ターゲット要素からルート要素へ、上位に向かいます (バブル)。Bubbling events bubble up from the target element to the root element. WPFWPF のイベント ルーティングについては、この概要の後半、および「ルーティング イベントの概要」でさらに詳しく説明されています。Event routing in WPFWPF is discussed in more detail later in this overview and in the Routed Events Overview.

Keyboard クラスと Mouse クラスKeyboard and Mouse Classes

@No__t-0 クラスと Mouse クラスは、基本要素クラスの入力 API に加えて、キーボードおよびマウス入力を操作するための追加の API を提供します。In addition to the input API on the base element classes, the Keyboard class and Mouse classes provide additional API for working with keyboard and mouse input.

@No__t-0 クラスの入力 API の例として、Modifiers プロパティがあります。このプロパティは、現在押されている @no__t 2 を返します。また、指定したキーが押されたかどうかを判断する IsKeyDown メソッドを返します。Examples of input API on the Keyboard class are the Modifiers property, which returns the ModifierKeys currently pressed, and the IsKeyDown method, which determines whether a specified key is pressed.

次の例では、GetKeyStatesメソッドを用いて、あるKeyが押された状態かどうかを調べます。The following example uses the GetKeyStates method to determine if a Key is in the down state.

// Uses the Keyboard.GetKeyStates to determine if a key is down.
// A bitwise AND operation is used in the comparison. 
// e is an instance of KeyEventArgs.
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
    btnNone.Background = Brushes.Red;
}
' Uses the Keyboard.GetKeyStates to determine if a key is down.
' A bitwise AND operation is used in the comparison. 
' e is an instance of KeyEventArgs.
If (Keyboard.GetKeyStates(Key.Return) And KeyStates.Down) > 0 Then
    btnNone.Background = Brushes.Red

@No__t-0 クラスの入力 API の例は、マウスの中央ボタンの状態を取得する MiddleButton です。また、マウスポインターの現在の要素を取得する DirectlyOver です。Examples of input API on the Mouse class are MiddleButton, which obtains the state of the middle mouse button, and DirectlyOver, which gets the element the mouse pointer is currently over.

次の例では、マウスのLeftButtonPressedの状態かどうかを調べています。The following example determines whether the LeftButton on the mouse is in the Pressed state.

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

MouseクラスとKeyboardクラスについては、この記事でさらに詳細を扱います。The Mouse and Keyboard classes are covered in more detail throughout this overview.

スタイラス入力Stylus Input

WPFWPF には、Stylus のサポートが統合されています。has integrated support for the Stylus. @No__t 0 は、Tablet PC で広く使われているペン入力です。The Stylus is a pen input made popular by the Tablet PC. @no__t 0 のアプリケーションは、マウス API を使用してスタイラスをマウスとして扱うことができますが、WPFWPF は、キーボードやマウスと同様のモデルを使用するスタイラスデバイスの抽象化も公開します。WPFWPF applications can treat the stylus as a mouse by using the mouse API, but WPFWPF also exposes a stylus device abstraction that use a model similar to the keyboard and mouse. スタイラス関連のすべての Api には、"スタイラス" という単語が含まれています。All stylus-related APIs contain the word "Stylus".

スタイラスはマウスとして動作できるため、マウス入力のみをサポートするアプリケーションでも、ある程度のスタイラス入力が自動的にサポートされます。Because the stylus can act as a mouse, applications that support only mouse input can still obtain some level of stylus support automatically. スタイラスがこのような手法で使用される場合、適切なスタイラス イベントを処理する機会が与えられた後に、対応するマウス イベントを処理する機会が与えられます。When the stylus is used in such a manner, the application is given the opportunity to handle the appropriate stylus event and then handles the corresponding mouse event. さらに、インク入力などのより高レベルなサービスも、スタイラス デバイスの抽象型を使って利用できます。In addition, higher-level services such as ink input are also available through the stylus device abstraction. 入力としてのインクの詳細については、「インクの概要」を参照してください。For more information about ink as input, see Getting Started with Ink.

イベント ルーティングEvent Routing

@No__t-0 は、そのコンテンツモデル内の子要素として他の要素を含むことができます。これにより、要素のツリーが形成されます。A FrameworkElement can contain other elements as child elements in its content model, forming a tree of elements. WPFWPF では、イベントを処理することで、親要素が、その子要素またはその他の子孫に命令された入力に関与できます。In WPFWPF, the parent element can participate in input directed to its child elements or other descendants by handing events. これは、小さいコントロールからコントロールをビルドする場合に特に役立ちます。このプロセスは "コントロール合成" または "合成" と呼ばれます。This is especially useful for building controls out of smaller controls, a process known as "control composition" or "compositing." 要素ツリー、および要素ツリーをイベント ルートに関連させる方法の詳細については、「WPF のツリー」を参照してください。For more information about element trees and how element trees relate to event routes, see Trees in WPF.

イベント ルーティングは、ルートに沿った特定のオブジェクトや要素が、異なる要素によって供給されたイベントに、(処理を介して) 重要な応答を提供できるように、イベントを複数の要素に転送するプロセスです。Event routing is the process of forwarding events to multiple elements, so that a particular object or element along the route can choose to offer a significant response (through handling) to an event that might have been sourced by a different element. ルーティング イベントには、直接、バブル、トンネルのいずれかのルーティング メカニズムが使用されます。Routed events use one of three routing mechanisms: direct, bubbling, and tunneling. 直接ルーティングでは、ソース要素が通知を受ける唯一の要素であり、イベントは他の要素にルーティングされません。In direct routing, the source element is the only element notified, and the event is not routed to any other elements. ただし、直接ルーティングイベントには、標準の CLR イベントとは対照的に、ルーティングイベントにのみ存在する追加の機能もいくつか用意されています。However, the direct routed event still offers some additional capabilities that are only present for routed events as opposed to standard CLR events. バブル ルーティングでは、最初にイベントの発生元である要素に通知し、次にその親要素へ、その次へと順に通知することで、要素ツリーの上位へ処理が実行されます。Bubbling works up the element tree by first notifying the element that sourced the event, then the parent element, and so on. トンネル ルーティングでは、要素ツリーのルートから始まり、下位へと処理が実行され、元のソース要素で終了します。Tunneling starts at the root of the element tree and works down, ending with the original source element. ルーティング イベントの詳細については、「ルーティング イベントの概要」を参照してください。For more information about routed events, see Routed Events Overview.

一般に、WPFWPF の入力イベントは、トンネル イベントとバブル イベントのペアで構成されます。WPFWPF input events generally come in pairs that consists of a tunneling event and a bubbling event. トンネリング イベントは、"Preview" プレフィックスでバブルリング イベントと区別されます。Tunneling events are distinguished from bubbling events with the "Preview" prefix. たとえば、PreviewMouseMove はマウス移動イベントのトンネリングバージョンであり、MouseMove はこのイベントのバブルバージョンです。For instance, PreviewMouseMove is the tunneling version of a mouse move event and MouseMove is the bubbling version of this event. このイベントのペアは、要素レベルで実装される規則であり、WPFWPF イベント システムの継承機能ではありません。This event pairing is a convention that is implemented at the element level and is not an inherent capability of the WPFWPF event system. 詳細については、「ルーティング イベントの概要」の「WPF の入力イベント」を参照してください。For details, see the WPF Input Events section in Routed Events Overview.

入力イベントの処理Handling Input Events

要素で入力を受け取るには、イベント ハンドラーをその特定のイベントに関連付ける必要があります。To receive input on an element, an event handler must be associated with that particular event. XAMLXAML では、これは簡単です。イベントの名前を、このイベントをリッスンする要素の属性として参照します。In XAMLXAML this is straightforward: you reference the name of the event as an attribute of the element that will be listening for this event. 次に、属性の値を、デリゲートに基づいて、定義するイベント ハンドラーの名前に設定します。Then, you set the value of the attribute to the name of the event handler that you define, based on a delegate. イベントハンドラーは、などC#のコードで記述する必要があり、分離コードファイルに含めることができます。The event handler must be written in code such as C# and can be included in a code-behind file.

キーボード イベントは、キーボード フォーカスが要素上にある状態で、オペレーティング システムがキー操作を報告すると発生します。Keyboard events occur when the operating system reports key actions that occur while keyboard focus is on an element. マウス イベントとスタイラス イベントはそれぞれ、要素との相対的なポインター位置の変化を報告するイベントと、 ボタンの状態の変更を報告するイベントの 2 つのカテゴリに分類されます。Mouse and stylus events each fall into two categories: events that report changes in pointer position relative to the element, and events that report changes in the state of device buttons.

キーボード入力イベントの例Keyboard Input Event Example

次の例では、左方向キーが押下されるのをリッスンします。The following example listens for a left arrow key press. Buttonを含むStackPanelが作成されます。A StackPanel is created that has a Button. 左矢印キーの押下をリッスンするイベント ハンドラーは、Buttonインスタンスに関連付けられます。An event handler to listen for the left arrow key press is attached to the Button instance.

例の最初のセクションでは、StackPanelButtonを作成し、 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

2番目のセクションはコード内に記述され、イベント ハンドラーを定義しています。The second section is written in code and defines the event handler. 左方向キーが押下されたときにButtonがキーボード フォーカスを持っていれば、 イベント ハンドラーが実行され、ButtonBackgroundの色が変更されます。When the left arrow key is pressed and the Button has keyboard focus, the handler runs and the Background color of the Button is changed. 左矢印キー以外のキーが押下された場合、ButtonBackgroundの色は元に戻されます。If the key is pressed, but it is not the left arrow key, the Background color of the Button is changed back to its starting color.

private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
    Button source = e.Source as Button;
    if (source != null)
    {
        if (e.Key == Key.Left)
        {
            source.Background = Brushes.LemonChiffon;
        }
        else
        {
            source.Background = Brushes.AliceBlue;
        }
    }
}
Private Sub OnButtonKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    Dim source As Button = TryCast(e.Source, Button)
    If source IsNot Nothing Then
        If e.Key = Key.Left Then
            source.Background = Brushes.LemonChiffon
        Else
            source.Background = Brushes.AliceBlue
        End If
    End If
End Sub

マウス入力イベントの例Mouse Input Event Example

次の例では、ButtonBackgroundの色は、 ButtonIn the following example, the Background color of a Button is changed when the mouse pointer enters the Button. Backgroundマウス ポインターがButtonに入ったときに変更され、マウス ポインターが離れるときに元に戻されます。The Background color is restored when the mouse leaves the Button.

例の最初のセクションでは、StackPanelButtonを作成し、 MouseEnterMouseLeaveイベントのイベント ハンドラーをButtonにアタッチします。The first section of the example creates the StackPanel and the Button control and attaches the event handlers for the MouseEnter and MouseLeave events to the Button.

<StackPanel>
  <Button Background="AliceBlue"
          MouseEnter="OnMouseExampleMouseEnter"
          MouseLeave="OnMosueExampleMouseLeave">Button
          
  </Button>
</StackPanel>
// Create the UI elements.
StackPanel mouseMoveStackPanel = new StackPanel();
Button mouseMoveButton = new Button();

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

// Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton);

// Attach event handler.
mouseMoveButton.MouseEnter += new MouseEventHandler(OnMouseExampleMouseEnter);
mouseMoveButton.MouseLeave += new MouseEventHandler(OnMosueExampleMouseLeave);
' Create the UI elements.
Dim mouseMoveStackPanel As New StackPanel()
Dim mouseMoveButton As New Button()

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

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

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

この例の 2 番目のセクションは、コード内に記述され、イベント ハンドラーを定義しています。The second section of the example is written in code and defines the event handlers. マウスを @no__t 0 に入力すると、Button の @no__t の1色が SlateGray に変更されます。When the mouse enters the Button, the Background color of the Button is changed to SlateGray. マウスが @no__t 0 のままになると、Button の @no__t 1 色が AliceBlue に変更されます。When the mouse leaves the Button, the Background color of the Button is changed back to AliceBlue.

private void OnMouseExampleMouseEnter(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.SlateGray;
    }
}
Private Sub OnMouseExampleMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
    ' Cast the source of the event to a Button.
    Dim source As Button = TryCast(e.Source, Button)

    ' If source is a Button.
    If source IsNot Nothing Then
        source.Background = Brushes.SlateGray
    End If
End Sub
private void OnMosueExampleMouseLeave(object sender, MouseEventArgs e)
{
    // Cast the source of the event to a Button.
    Button source = e.Source as Button;

    // If source is a Button.
    if (source != null)
    {
        source.Background = Brushes.AliceBlue;
    }
}
Private Sub OnMosueExampleMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
    ' Cast the source of the event to a Button.
    Dim source As Button = TryCast(e.Source, Button)

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

テキスト入力Text Input

@No__t-0 イベントを使用すると、デバイスに依存しない方法でテキスト入力をリッスンできます。The TextInput event enables you to listen for text input in a device-independent manner. テキスト入力の主な手段はキーボードですが、音声認識、手書き入力、その他の入力デバイスでもテキストを入力できます。The keyboard is the primary means of text input, but speech, handwriting, and other input devices can generate text input also.

キーボード入力の場合、WPFWPFは、 まず適切なKeyDown/ KeyUpイベントを発生させます。For keyboard input, WPFWPF first sends the appropriate KeyDown/KeyUp events. これらのイベントが処理されず、かつキーが方向キーやファンクション キーなどではなくテキストである場合、 TextInputイベントが発生します。If those events are not handled and the key is textual (rather than a control key such as directional arrows or function keys), then a TextInput event is raised. KeyDown/ KeyUpTextInputイベントの間には、常に単純な1対1のマッピングがあるわけではありません。 複数のキーストロークが1つの文字を入力したり、単一のキーストロークで複数の文字から成る文字列を入力したりできるからです。There is not always a simple one-to-one mapping between KeyDown/KeyUp and TextInput events because multiple keystrokes can generate a single character of text input and single keystrokes can generate multi-character strings. これは、中国語、日本語、韓国語などの言語で、入力方式エディター (Ime) を使用して、対応するアルファベットで何千もの文字を生成する場合に特に当てはまります。This is especially true for languages such as Chinese, Japanese, and Korean which use Input Method Editors (IMEs) to generate the thousands of possible characters in their corresponding alphabets.

@No__t-0 が KeyUp @ no__t-2 @ no__t イベントを送信する場合、キーストロークが6イベント @no__t の一部になる (たとえば、ALT + S キーが押されている) 場合、KeyKey.System に設定されます。When WPFWPF sends a KeyUp/KeyDown event, Key is set to Key.System if the keystrokes could become part of a TextInput event (if ALT+S is pressed, for example). これにより、KeyDown イベントハンドラーのコードで Key.System を確認し、見つかった場合は、その後に発生した TextInput イベントのハンドラーの処理を終了できます。This allows code in a KeyDown event handler to check for Key.System and, if found, leave processing for the handler of the subsequently raised TextInput event. このような場合は、@no__t 0 引数のさまざまなプロパティを使用して、元のキー入力を決定できます。In these cases, the various properties of the TextCompositionEventArgs argument can be used to determine the original keystrokes. 同様に、IME がアクティブな場合、Key の値は Key.ImeProcessed であり、ImeProcessedKey は元のキーストロークまたはキーストロークを与えます。Similarly, if an IME is active, Key has the value of Key.ImeProcessed, and ImeProcessedKey gives the original keystroke or keystrokes.

次の例では、ClickイベントとKeyDownイベントのイベント ハンドラーを定義しています。The following example defines a handler for the Click event and a handler for the KeyDown event.

最初のセクションでは、ユーザー インターフェイスを作成します。The first segment of code or markup creates the user interface.

<StackPanel KeyDown="OnTextInputKeyDown">
  <Button Click="OnTextInputButtonClick"
          Content="Open" />
  <TextBox> . . . </TextBox>
</StackPanel>
// Create the UI elements.
StackPanel textInputStackPanel = new StackPanel();
Button textInputeButton = new Button();
TextBox textInputTextBox = new TextBox();
textInputeButton.Content = "Open";

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

// Attach event handlers.
textInputStackPanel.KeyDown += new KeyEventHandler(OnTextInputKeyDown);
textInputeButton.Click += new RoutedEventHandler(OnTextInputButtonClick);
' Create the UI elements.
Dim textInputStackPanel As New StackPanel()
Dim textInputeButton As New Button()
Dim textInputTextBox As New TextBox()
textInputeButton.Content = "Open"

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

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

次のセクションには、イベント ハンドラーが含まれています。The second segment of code contains the event handlers.

private void OnTextInputKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.O && Keyboard.Modifiers == ModifierKeys.Control)
    {
        handle();
        e.Handled = true;
    }
}

private void OnTextInputButtonClick(object sender, RoutedEventArgs e)
{
    handle();
    e.Handled = true;
} 

public void handle()
{
    MessageBox.Show("Pretend this opens a file");
}
Private Sub OnTextInputKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
    If e.Key = Key.O AndAlso Keyboard.Modifiers = ModifierKeys.Control Then
        handle()
        e.Handled = True
    End If
End Sub

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

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

入力イベントはイベントのルートをバブルアップするため、 StackPanelは要素がキーボード フォーカスを持っているかどうかに関係なく入力を受け取ります。Because input events bubble up the event route, the StackPanel receives the input regardless of which element has keyboard focus. TextBoxコントロールが最初に通知を受け取り、 TextBoxが入力を処理しなかった場合にのみOnTextInputKeyDownハンドラーが呼び出されます。The TextBox control is notified first and the OnTextInputKeyDown handler is called only if the TextBox did not handle the input. PreviewKeyDownイベントがKeyDownイベントの代わりに使用された場合、 OnTextInputKeyDownハンドラーが最初に呼び出されます。If the PreviewKeyDown event is used instead of the KeyDown event, the OnTextInputKeyDown handler is called first.

この例では、Ctrl + O キー操作とボタンのクリック イベントの2つの部分に、同じ処理ロジックが記述されています。In this example, the handling logic is written two times—one time for CTRL+O, and again for button's click event. これは、入力イベントを直接処理する代わりにコマンドを使用すると、簡略化することができます。This can be simplified by using commands, instead of handling the input events directly. コマンドについては、この概要と「コマンド実行の概要」で説明されています。Commands are discussed in this overview and in Commanding Overview.

タッチおよび操作Touch and Manipulation

Windows 7 オペレーティング システムの新しいハードウェアと API では、アプリケーションが、複数のタッチからの入力を同時に受け取ることができる機能を提供しています。New hardware and API in the Windows 7 operating system provide applications the ability to receive input from multiple touches simultaneously. WPFWPF を使用すると、タッチが行われたときにイベントを発生させることで、マウスやキーボードなどの他の入力に応答する場合と同様に、アプリケーションでタッチを検出して応答できます。enables applications to detect and respond to touch in a manner similar to responding to other input, such as the mouse or keyboard, by raising events when touch occurs.

WPFWPF では、タッチが行われると、タッチ イベントと操作イベントという 2 種類のイベントを公開します。exposes two types of events when touch occurs: touch events and manipulation events. タッチ イベントは、タッチスクリーン上の各指とその動きについて生データを提供します。Touch events provide raw data about each finger on a touchscreen and its movement. 操作イベントは、入力を特定のアクションとして解釈します。Manipulation events interpret the input as certain actions. このセクションでは、この 2 種類のイベントについて説明します。Both types of events are discussed in this section.

前提条件Prerequisites

タッチに応答するアプリケーションを開発するには、次のコンポーネントが必要です。You need the following components to develop an application that responds to touch.

  • Visual Studio 2010。Visual Studio 2010.

  • Windows 7。Windows 7.

  • Windows タッチをサポートするデバイス (タッチスクリーンなど)。A device, such as a touchscreen, that supports Windows Touch.

用語Terminology

タッチについて説明するときに使用される用語を次に示します。The following terms are used when touch is discussed.

  • タッチは、Windows 7 で認識されるユーザー入力の種類です。Touch is a type of user input that is recognized by Windows 7. 通常、タッチを検知するスクリーンに指を当てると、タッチが開始されます。Usually, touch is initiated by putting fingers on a touch-sensitive screen. デバイスによって指の位置と動きがマウス入力として変換されるだけの場合、ノート PC で一般的なタッチパッドなどのデバイスでは、タッチがサポートされないことに注意してください。Note that devices such as a touchpad that is common on laptop computers do not support touch if the device merely converts the finger's position and movement as mouse input.

  • マルチタッチは、複数のポイントが同時に行われるときのタッチです。Multitouch is touch that occurs from more than one point simultaneously. Windows 7 および WPFWPF では、マルチタッチをサポートします。Windows 7 and WPFWPF supports multitouch. WPFWPF に関するドキュメントでタッチについて説明されている場合、その概念はマルチタッチを対象とします。Whenever touch is discussed in the documentation for WPFWPF, the concepts apply to multitouch.

  • 操作は、タッチが、オブジェクトに適用される物理的なアクションとして解釈されるときに発生します。A manipulation occurs when touch is interpreted as a physical action that is applied to an object. WPFWPF では、操作イベントによって、平行移動、拡大縮小、または回転の各操作として入力が解釈されます。In WPFWPF, manipulation events interpret input as a translation, expansion, or rotation manipulation.

  • touch device は、タッチスクリーン上での 1 本の指など、タッチ入力を生成するデバイスを表します。A touch device represents a device that produces touch input, such as a single finger on a touchscreen.

タッチに応答するコントロールControls that Respond to Touch

次のコントロールは、スクロールされて見えないコンテンツがある場合に、コントロール上を指でドラッグするとスクロールできます。The following controls can be scrolled by dragging a finger across the control if it has content that is scrolled out of view.

@No__t-0 は ScrollViewer.PanningMode 添付プロパティを定義します。このプロパティを使用すると、タッチパンを水平方向、垂直方向、または両方のどちらで有効にするかを指定できます。The ScrollViewer defines the ScrollViewer.PanningMode attached property that enables you to specify whether touch panning is enabled horizontally, vertically, both, or neither. @No__t-0 プロパティは、ユーザーがタッチスクリーンから指を離したときに、スクロール速度を遅くする速度を指定します。The ScrollViewer.PanningDeceleration property specifies how quickly the scrolling slows down when the user lifts the finger from the touchscreen. @No__t-0 添付プロパティは、操作オフセットを平行移動するためのスクロールオフセットの比率を指定します。The ScrollViewer.PanningRatio attached property specifies the ratio of scrolling offset to translate manipulation offset.

タッチ イベントTouch Events

基本クラス (UIElementUIElement3D、および ContentElement) は、アプリケーションがタッチに応答するようにサブスクライブできるイベントを定義します。The base classes, UIElement, UIElement3D, and ContentElement, define events that you can subscribe to so your application will respond to touch. タッチ イベントは、アプリケーションでタッチがオブジェクトの操作以外の動作として解釈される場合に役立ちます。Touch events are useful when your application interprets touch as something other than manipulating an object. たとえば、ユーザーが 1 本以上の指を使って描画できるアプリケーションは、タッチ イベントをサブスクライブします。For example, an application that enables a user to draw with one or more fingers would subscribe to touch events.

この 3 つのクラスはすべて、定義クラスに関係なく、動作がよく似た次のイベントを定義します。All three classes define the following events, which behave similarly, regardless of the defining class.

キーボード イベントやマウス イベントと同様に、タッチ イベントはルーティング イベントです。Like keyboard and mouse events, the touch events are routed events. Preview で始まるイベントはトンネル イベントで、Touch で始まるイベントはバブル イベントです。The events that begin with Preview are tunneling events and the events that begin with Touch are bubbling events. ルーティング イベントの詳細については、「ルーティング イベントの概要」を参照してください。For more information about routed events, see Routed Events Overview. これらのイベントを処理すると、GetTouchPoint または GetIntermediateTouchPoints のいずれかのメソッドを呼び出すことによって、任意の要素を基準とした入力の位置を取得できます。When you handle these events, you can get the position of the input, relative to any element, by calling the GetTouchPoint or GetIntermediateTouchPoints method.

タッチ イベント間の対話について理解するには、ユーザーがある要素の上に指を 1 本置き、その要素内で指を動かした後、要素から指を離すシナリオを考えてみます。To understand the interaction among the touch events, consider the scenario where a user puts one finger on an element, moves the finger in the element, and then lifts the finger from the element. 次の図は、バブル イベントの実行について示しています (わかりやすくするため、トンネル イベントは省略しています)。The following illustration shows the execution of the bubbling events (the tunneling events are omitted for simplicity).

タッチイベントのシーケンス。タッチイベントThe sequence of touch events. Touch events

次のリストに、前の図のイベントのシーケンスを示します。The following list describes the sequence of the events in the preceding illustration.

  1. @No__t-0 イベントは、ユーザーが要素に指を置いたときに1回発生します。The TouchEnter event occurs one time when the user puts a finger on the element.

  2. @No__t-0 イベントが1回発生します。The TouchDown event occurs one time.

  3. @No__t-0 イベントは、ユーザーが要素内で指を動かしたときに複数回発生します。The TouchMove event occurs multiple times as the user moves the finger within the element.

  4. @No__t-0 イベントは、ユーザーが要素から指を離したときに1回発生します。The TouchUp event occurs one time when the user lifts the finger from the element.

  5. @No__t-0 イベントが1回発生します。The TouchLeave event occurs one time.

3 本以上の指を使用した場合は、それぞれの指に対してイベントが発生します。When more than two fingers are used, the events occur for each finger.

操作イベントManipulation Events

アプリケーションでユーザーがオブジェクトを操作できるようにする場合、UIElement クラスは操作イベントを定義します。For cases where an application enables a user to manipulate an object, the UIElement class defines manipulation events. 単にタッチの位置を報告するタッチ イベントとは異なり、操作イベントは、入力がどのように解釈されるかを報告します。Unlike the touch events that simply report the position of touch, the manipulation events report how the input can be interpreted. 操作には、平行移動、拡大縮小、および回転の 3 種類があります。There are three types of manipulations, translation, expansion, and rotation. 次のリストでは、3 種類の操作を呼び出す方法を示します。The following list describes how to invoke the three types of manipulations.

  • 平行移動の操作を呼び出すには、オブジェクトの上に指を置き、タッチスクリーン上で指を動かします。Put a finger on an object and move the finger across the touchscreen to invoke a translation manipulation. 通常、この操作を行うと、オブジェクトが移動します。This usually moves the object.

  • 拡大縮小の操作を呼び出すには、オブジェクトの上に 2 本の指を置き、2 本の指を近づけたり離したりします。Put two fingers on an object and move the fingers closer together or farther apart from one another to invoke an expansion manipulation. 通常、この操作を行うと、オブジェクトのサイズが変更されます。This usually resizes the object.

  • 回転の操作を呼び出すには、オブジェクトの上に 2 本の指を置き、一方の指を中心にもう一方の指を回転させます。Put two fingers on an object and rotate the fingers around each other to invoke a rotation manipulation. 通常、この操作を行うと、オブジェクトが回転します。This usually rotates the object.

2 種類以上の操作を同時に発生させることもできます。More than one type of manipulation can occur simultaneously.

オブジェクトを操作に応答させると、オブジェクトに慣性があるように見せることができます。When you cause objects to respond to manipulations, you can have the object appear to have inertia. これにより、オブジェクトに現実の世界をシミュレートさせることができます。This can make your objects simulate the physical world. たとえば、テーブル上で書籍を押す場合、強く押すと、書籍は離した後も移動し続けます。For example, when you push a book across a table, if you push hard enough the book will continue to move after you release it. WPFWPF を使用すると、ユーザーがオブジェクトから指を離した後に、操作イベントを発生させることで、この動作をシミュレートできます。enables you to simulate this behavior by raising manipulation events after the user's fingers releases the object.

ユーザーがオブジェクトを移動、サイズ変更、および回転できるようにするアプリケーションを作成する方法については、[Walkthrough を参照してください。最初のタッチアプリケーション @ no__t を作成しています。For information about how to create an application that enables the user to move, resize, and rotate an object, see Walkthrough: Creating Your First Touch Application.

@No__t-0 は、次の操作イベントを定義します。The UIElement defines the following manipulation events.

既定では、UIElement は、これらの操作イベントを受け取りません。By default, a UIElement does not receive these manipulation events. @No__t 0 で操作イベントを受信するには、UIElement.IsManipulationEnabledtrue に設定します。To receive manipulation events on a UIElement, set UIElement.IsManipulationEnabled to true.

操作イベントの実行パスThe Execution Path of Manipulation Events

ユーザーがオブジェクトを "スローする" シナリオを検討します。Consider a scenario where a user "throws" an object. ユーザーは、オブジェクトの上に指を置き、タッチスクリーン上で指を短い距離移動させ、オブジェクトの移動中に指を離します。The user puts a finger on the object, moves the finger across the touchscreen for a short distance, and then lifts the finger while it is moving. この結果、オブジェクトはユーザーの指の下で移動し、ユーザーが指を離した後も移動を続けます。The result of this is that the object will move under the user's finger and continue to move after the user lifts the finger.

次の図は、操作イベントの実行パスと各イベントに関する重要な情報を示しています。The following illustration shows the execution path of manipulation events and important information about each event.

操作イベントのシーケンス。操作イベントThe sequence of manipulation events. Manipulation events

次のリストに、前の図のイベントのシーケンスを示します。The following list describes the sequence of the events in the preceding illustration.

  1. @No__t-0 イベントは、ユーザーがオブジェクトに指を置いたときに発生します。The ManipulationStarting event occurs when the user places a finger on the object. 特に、このイベントを使用して ManipulationContainer プロパティを設定できます。Among other things, this event allows you to set the ManipulationContainer property. 後続のイベントでは、操作の位置は ManipulationContainer に対して相対的になります。In the subsequent events, the position of the manipulation will be relative to the ManipulationContainer. @No__t-0 以外のイベントでは、このプロパティは読み取り専用であるため、このプロパティを設定できるのは ManipulationStarting イベントだけです。In events other than ManipulationStarting, this property is read-only, so the ManipulationStarting event is the only time that you can set this property.

  2. @No__t-0 イベントが次に発生します。The ManipulationStarted event occurs next. このイベントは、操作の起点を報告します。This event reports the origin of the manipulation.

  3. @No__t-0 イベントは、タッチスクリーン上でユーザーの指が移動すると複数回発生します。The ManipulationDelta event occurs multiple times as a user's fingers move on a touchscreen. @No__t-1 クラスの @no__t 0 プロパティは、操作が移動、展開、または変換として解釈されるかどうかを報告します。The DeltaManipulation property of the ManipulationDeltaEventArgs class reports whether the manipulation is interpreted as movement, expansion, or translation. ここで、オブジェクトを操作する作業のほとんどを実行します。This is where you perform most of the work of manipulating an object.

  4. @No__t-0 イベントは、ユーザーの指がオブジェクトとの接続を失ったときに発生します。The ManipulationInertiaStarting event occurs when the user's fingers lose contact with the object. このイベントでは、慣性による処理中の操作の減速を指定できます。This event enables you to specify the deceleration of the manipulations during inertia. これは、選択した場合、オブジェクトが異なる物理領域や属性をエミュレートできるようにするためです。This is so your object can emulate different physical spaces or attributes if you choose. たとえば、アプリケーションが現実の世界のアイテムを表す 2 つのオブジェクトを保持していて、一方のオブジェクトがもう一方のオブジェクトよりも重いとします。For example, suppose your application has two objects that represent items in the physical world, and one is heavier than the other. 重いオブジェクトを軽いオブジェクトよりもすばやく減速させるようにすることができます。You can make the heavier object decelerate faster than the lighter object.

  5. @No__t-0 イベントは、慣性が発生すると複数回発生します。The ManipulationDelta event occurs multiple times as inertia occurs. このイベントは、ユーザーの指がタッチスクリーン上で移動したとき、および WPFWPF が慣性による処理をシミュレートしたときに発生することに注意してください。Note that this event occurs when the user's fingers move across the touchscreen and when WPFWPF simulates inertia. つまり、ManipulationInertiaStarting イベントの前後に ManipulationDelta が発生します。In other words, ManipulationDelta occurs before and after the ManipulationInertiaStarting event. @No__t-0 プロパティは、ManipulationDelta イベントが慣性中に発生するかどうかを報告します。そのため、プロパティを確認し、その値に応じて異なるアクションを実行できます。The ManipulationDeltaEventArgs.IsInertial property reports whether the ManipulationDelta event occurs during inertia, so you can check that property and perform different actions, depending on its value.

  6. @No__t-0 イベントは、操作と慣性が終了したときに発生します。The ManipulationCompleted event occurs when the manipulation and any inertia ends. つまり、すべての @no__t 0 イベントが発生した後、ManipulationCompleted イベントが発生し、操作が完了したことが通知されます。That is, after all the ManipulationDelta events occur, the ManipulationCompleted event occurs to signal that the manipulation is complete.

@No__t-0 も ManipulationBoundaryFeedback イベントを定義します。The UIElement also defines the ManipulationBoundaryFeedback event. このイベントは、ReportBoundaryFeedback メソッドが ManipulationDelta イベントで呼び出されたときに発生します。This event occurs when the ReportBoundaryFeedback method is called in the ManipulationDelta event. @No__t 0 イベントは、オブジェクトが境界に達したときに、アプリケーションまたはコンポーネントが視覚的なフィードバックを提供できるようにします。The ManipulationBoundaryFeedback event enables applications or components to provide visual feedback when an object hits a boundary. たとえば、Window クラスは、ManipulationBoundaryFeedback イベントを処理して、ウィンドウが枠を置いたときに少し移動するようにします。For example, the Window class handles the ManipulationBoundaryFeedback event to cause the window to slightly move when its edge is encountered.

操作を取り消すには、ManipulationBoundaryFeedback イベントを除く任意の操作イベントのイベント引数に対して Cancel メソッドを呼び出します。You can cancel the manipulation by calling the Cancel method on the event arguments in any manipulation event except ManipulationBoundaryFeedback event. @No__t-0 を呼び出すと、操作イベントは発生しなくなり、タッチのためにマウスイベントが発生します。When you call Cancel, the manipulation events are no longer raised and mouse events occur for touch. 次の表は、操作が取り消される時間と発生するマウス イベントとの間の関係を示しています。The following table describes the relationship between the time the manipulation is canceled and the mouse events that occur.

Cancel が呼び出されるイベントThe event that Cancel is called in 既に行われている入力に対して発生するマウス イベントThe mouse events that occur for input that already occurred
ManipulationStarting および ManipulationStartedManipulationStarting and ManipulationStarted マウス ボタンを押すイベント。Mouse down events.
ManipulationDelta マウス ボタンを押すイベントおよびマウス移動イベント。Mouse down and mouse move events.
ManipulationInertiaStarting および ManipulationCompletedManipulationInertiaStarting and ManipulationCompleted マウス ボタンを押すイベント、マウス移動イベント、およびマウス ボタンを放すイベント。Mouse down, mouse move, and mouse up events.

操作が慣性であるときに Cancel を呼び出すと、メソッドは false を返し、入力によってマウスイベントが発生しないことに注意してください。Note that if you call Cancel when the manipulation is in inertia, the method returns false and the input does not raise mouse events.

タッチ イベントと操作イベントの関係The Relationship Between Touch and Manipulation Events

@No__t 0 は常にタッチイベントを受け取ることができます。A UIElement can always receive touch events. @No__t-0 プロパティが true に設定されている場合、UIElement はタッチイベントと操作イベントの両方を受け取ることができます。When the IsManipulationEnabled property is set to true, a UIElement can receive both touch and manipulation events. @No__t-0 イベントが処理されない場合 (つまり、Handled プロパティが false)、操作ロジックは要素にタッチをキャプチャし、操作イベントを生成します。If the TouchDown event is not handled (that is, the Handled property is false), the manipulation logic captures the touch to the element and generates the manipulation events. @No__t-0 プロパティが TouchDown イベントの true に設定されている場合、操作ロジックは操作イベントを生成しません。If the Handled property is set to true in the TouchDown event, the manipulation logic does not generate manipulation events. 次の図は、タッチ イベントと操作イベントの関係を示しています。The following illustration shows the relationship between touch events and manipulation events.

タッチイベントと操作イベントの関係 touch イベントと操作イベントの関係Relationship between touch and manipulation events Touch and manipulation events

次のリストに、前の図に示したタッチ イベントと操作イベントの関係を示します。The following list describes the relationship between the touch and manipulation events that is shown in the preceding illustration.

フォーカスFocus

WPFWPF では、フォーカスに関してキーボード フォーカスと論理フォーカスという 2 つの主要な概念があります。There are two main concepts that pertain to focus in WPFWPF: keyboard focus and logical focus.

キーボード フォーカスKeyboard Focus

キーボード フォーカスは、キーボード入力を受け取っている要素を参照しています。Keyboard focus refers to the element that is receiving keyboard input. キーボード フォーカスを持つ要素は、デスクトップ全体で 1 つしかありません。There can be only one element on the whole desktop that has keyboard focus. WPFWPFでは、 キーボード フォーカスを持つ要素のIsKeyboardFocusedtrueに設定されます。In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. Keyboardクラスの静的メソッドFocusedElementは、 現在キーボード フォーカスがある要素を返します。The static Keyboard method FocusedElement returns the element that currently has keyboard focus.

tab キーで要素に移動したり、TextBoxなど特定の要素上でマウスをクリックしたりすることで、 キーボード フォーカスを取得できます。Keyboard focus can be obtained by tabbing to an element or by clicking the mouse on certain elements, such as a TextBox. また、KeyboardクラスのFocusメソッドを使用して、 プログラムでキーボード フォーカスを取得することもできます。Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Focusメソッドは、指定された要素にキーボード フォーカスを与えようとします。Focus attempts to give the specified element keyboard focus. Focusの返す要素が、現在キーボード フォーカスを持つ要素です。The element returned by Focus is the element that currently has keyboard focus.

要素にキーボード フォーカスを設定するために、Focusableプロパティ およびIsVisibleプロパティはtrueに設定しておく必要があります。In order for an element to obtain keyboard focus the Focusable property and the IsVisible properties must be set to true. Panelなどのいくつかのクラスでは、 Focusableがデフォルトでfalseに設定されているため、 その要素にフォーカスを設定したい場合はtrueに設定する必要があります。Some classes, such as Panel, have Focusable set to false by default; therefore, you may have to set this property to true if you want that element to be able to obtain focus.

次の例ではButtonにキーボード フォーカスを設定するためにFocusを使用します。The following example uses Focus to set keyboard focus on a Button. アプリケーションの初期フォーカスを設定する推奨場所は、Loadedイベント ハンドラーです。The recommended place to set initial focus in an application is in the Loaded event handler.

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

キーボード フォーカスの詳細については、「フォーカスの概要」を参照してください。For more information about keyboard focus, see Focus Overview.

論理フォーカスLogical Focus

論理フォーカスは、フォーカス スコープ内のFocusManager.FocusedElementを指します。Logical focus refers to the FocusManager.FocusedElement in a focus scope. アプリケーション内の複数の要素が論理フォーカスを持つことがありますが、特定のフォーカス スコープで論理フォーカスを持つ要素は 1 つだけに限られます。There can be multiple elements that have logical focus in an application, but there may only be one element that has logical focus in a particular focus scope.

フォーカス スコープはコンテナー要素で、そのスコープ内のFocusedElementを追跡します。A focus scope is a container element that keeps track of the FocusedElement within its scope. フォーカスがフォーカス スコープを離れると、フォーカスがある要素はキーボード フォーカスを失いますが、論理フォーカスはそのまま保持されます。When focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. フォーカスがフォーカス スコープに戻ると、論理フォーカスがある要素はキーボード フォーカスを取得します。When focus returns to the focus scope, the focused element will obtain keyboard focus. これにより、キーボード フォーカスを複数のフォーカス スコープ間で変更できますが、 フォーカスが戻ると、そのフォーカス スコープ内の論理フォーカスのある要素がキーボード フォーカスのある要素として保持されることが保証されます。This allows for keyboard focus to be changed between multiple focus scopes but insures that the focused element within the focus scope remains the focused element when focus returns.

Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)FocusManagerIsFocusScope添付プロパティをtrueに設定するか、 コードを使用してSetIsFocusScopeメソッドを使用して添付プロパティを設定することにより、 要素をフォーカス スコープに変換できます。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.

次の例では、StackPanelIsFocusScope添付プロパティを設定してフォーカス スコープに変換しています。The following example makes a StackPanel into a focus scope by setting the IsFocusScope attached property.

<StackPanel Name="focusScope1" 
            FocusManager.IsFocusScope="True"
            Height="200" Width="200">
  <Button Name="button1" Height="50" Width="50"/>
  <Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);
Dim focuseScope2 As New StackPanel()
FocusManager.SetIsFocusScope(focuseScope2, True)

WPFWPFで、デフォルトでフォーカス スコープであるクラスは、WindowMenuToolBarContextMenuです。Classes in WPFWPF which are focus scopes by default are Window, Menu, ToolBar, and ContextMenu.

キーボードフォーカスを持つ要素は、それが属するフォーカス スコープに対して論理フォーカスがあります。そのため、Focusクラスまたは基本要素クラスのフォーカスメソッドを使用して要素にフォーカスを設定すると、要素に Keyboardと論理フォーカスが設定されます。An element that has keyboard focus will also have logical focus for the focus scope it belongs to; therefore, setting focus on an element with the Focus method on the Keyboard class or the base element classes will attempt to give the element keyboard focus and logical focus.

フォーカス スコープでフォーカスがある要素を調べるにはGetFocusedElementします。To determine the focused element in a focus scope, use GetFocusedElement. フォーカス スコープのフォーカスがある要素を変更するSetFocusedElementします。To change the focused element for a focus scope, use SetFocusedElement.

論理フォーカスの詳細については、「フォーカスの概要」を参照してください。For more information about logical focus, see Focus Overview.

マウスの位置Mouse Position

@No__t 0 入力 API は、座標空間に関する有用な情報を提供します。The WPFWPF input API provides helpful information with regard to coordinate spaces. たとえば、座標 (0,0) は左上からの座標ですが、これはツリーのどの要素の左上でしょうか。For example, coordinate (0,0) is the upper-left coordinate, but the upper-left of which element in the tree? 入力対象の要素でしょうか。The element that is the input target? イベント ハンドラーを適用した要素でしょうか。The element you attached your event handler to? または、それ以外でしょうか。Or something else? 混乱を避けるために、@no__t 0 入力 API では、マウスで取得した座標を操作するときに、参照のフレームを指定する必要があります。To avoid confusion, the WPFWPF input API requires that you specify your frame of reference when you work with coordinates obtained through the mouse. GetPositionメソッドは、マウス ポインターの指定された要素に対する相対的な座標を返します。The GetPosition method returns the coordinate of the mouse pointer relative to the specified element.

マウス キャプチャMouse Capture

マウス デバイスは、マウス キャプチャと呼ばれるモーダル特性を特別に備えています。Mouse devices specifically hold a modal characteristic known as mouse capture. マウス キャプチャは、ドラッグ アンド ドロップ操作が開始されたときの入力の遷移状態を保持するために使用されます。これにより、マウス ポインターの画面上の標準位置に関係する他の操作は、必ずしも発生しません。Mouse capture is used to maintain a transitional input state when a drag-and-drop operation is started, so that other operations involving the nominal on-screen position of the mouse pointer do not necessarily occur. ドラッグの間、ユーザーはドラッグ アンド ドロップを中止しない限り、クリックすることはできません。このため、マウス キャプチャはドラッグ元によって保持され、マウスを置いたときのキューの大部分は適切でなくなります。During the drag, the user cannot click without aborting the drag-and-drop, which makes most mouseover cues inappropriate while the mouse capture is held by the drag origin. 入力システムは、マウスキャプチャの状態を決定できる Api と、特定の要素に対してマウスキャプチャを強制する Api、またはマウスキャプチャの状態をクリアする api を公開します。The input system exposes APIs that can determine mouse capture state, as well as APIs that can force mouse capture to a specific element, or clear mouse capture state. ドラッグ アンド ドロップ操作の詳細については、「ドラッグ アンド ドロップの概要」を参照してください。For more information on drag-and-drop operations, see Drag and Drop Overview.

コマンドCommands

コマンドでは、デバイス入力よりもセマンティックなレベルの入力処理が可能です。Commands enable input handling at a more semantic level than device input. コマンドは、CutCopyPasteOpenなどの簡単なディレクティブです。Commands are simple directives, such as Cut, Copy, Paste, or Open. コマンドは、コマンド ロジックを一元管理するために役立ちます。Commands are useful for centralizing your command logic. MenuToolBarやキーボード ショートカットを使用して 同じコマンドにアクセスできるかもしれません。The same command might be accessed from a Menu, on a ToolBar, or through a keyboard shortcut. またコマンドは、コマンドが使用できないときにコントロールを無効にするための機構も提供します。Commands also provide a mechanism for disabling controls when the command becomes unavailable.

RoutedCommandは、 WPFWPFにおけるICommandの実装です。RoutedCommand is the WPFWPF implementation of ICommand. RoutedCommandが実行されると、PreviewExecutedイベントと Executedイベントがコマンド ターゲットで発生し、他の入力と同様に要素ツリーをトンネルあるいはバブリングします。When a RoutedCommand is executed, a PreviewExecuted and an Executed event are raised on the command target, which tunnel and bubble through the element tree like other input. コマンドの対象が設定されていない場合は、キーボード フォーカスを持つ要素がコマンドの対象になります。If a command target is not set, the element with keyboard focus will be the command target. コマンドを実行するロジックはCommandBindingにアタッチされています。The logic that performs the command is attached to a CommandBinding. ExecutedイベントがそのコマンドのCommandBindingに到達すると、 CommandBinding上のExecutedRoutedEventHandlerが呼び出されます。When an Executed event reaches a CommandBinding for that specific command, the ExecutedRoutedEventHandler on the CommandBinding is called. このハンドラーが、コマンドのアクションを実行します。This handler performs the action of the command.

コマンドの詳細については、コマンド実行の概要を参照してください。For more information on commanding, see Commanding Overview.

WPFWPFは、ApplicationCommandsMediaCommandsComponentCommandsNavigationCommandsEditingCommandsで一般的なコマンドのライブラリを提供しています。また、コマンドを独自に定義することもできます。provides a library of common commands which consists of ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommands, and EditingCommands, or you can define your own.

次の例では、MenuItemがクリックされたとき、 TextBox上でPasteコマンドを実行するよう設定する方法を示します。 TextBoxにキーボード フォーカスがあると想定しています。The following example shows how to set up a MenuItem so that when it is clicked it will invoke the Paste command on the TextBox, assuming the TextBox has keyboard focus.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
  // Creating the UI objects
  StackPanel mainStackPanel = new StackPanel();
  TextBox pasteTextBox = new TextBox();
  Menu stackPanelMenu = new Menu();
  MenuItem pasteMenuItem = new MenuItem();
 
  // Adding objects to the panel and the menu
  stackPanelMenu.Items.Add(pasteMenuItem);
  mainStackPanel.Children.Add(stackPanelMenu);
  mainStackPanel.Children.Add(pasteTextBox);

  // Setting the command to the Paste command
  pasteMenuItem.Command = ApplicationCommands.Paste;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()

' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)

' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste

WPFWPFにおけるのコマンドの詳細については、 「コマンド実行の概要」を参照してください。For more information about commands in WPFWPF, see Commanding Overview.

入力システムと基本要素The Input System and Base Elements

MouseKeyboardStylusクラスの添付イベントのような 入力イベントは、入力システムが発生させ、ヒット テストの実行時に、ビジュアル ツリーに基づくオブジェクト モデル内の特定位置に挿入します。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.

MouseKeyboardStylusで 添付イベントとして定義されている各イベントは、UIElementContentElementという基本要素クラスで、 新しいルーティング イベントとして再び公開されています。Each of the events that Mouse, Keyboard, and Stylus define as an attached event is also re-exposed by the base element classes UIElement and ContentElement as a new routed event. 基本要素のルーティング イベントは、元の添付イベントを処理し、イベント データを再利用するクラスによって生成されます。The base element routed events are generated by classes handling the original attached event and reusing the event data.

入力イベントが、その基本要素の入力イベントの実装によって、特定のソース要素に関連付けられると、論理ツリー オブジェクトとビジュアル ツリー オブジェクトの組み合わせに基づく残りのイベント ルートを通じてルーティングされ、アプリケーション コードで処理することができます。When the input event becomes associated with a particular source element through its base element input event implementation, it can be routed through the remainder of an event route that is based on a combination of logical and visual tree objects, and be handled by application code. 一般に、XAMLXAML とコードの両方で直感的なイベントハンドラー構文を使用できるため、UIElement および ContentElement のルーティングイベントを使用して、これらのデバイスに関連する入力イベントを処理する方が便利です。Generally, it is more convenient to handle these device-related input events using the routed events on UIElement and ContentElement, because you can use more intuitive event handler syntax both in XAMLXAML and in code. プロセスを開始した添付イベントを処理することもできますが、いくつかの問題があります。添付イベントには、基本要素クラス処理によって処理されることがマークされる可能性があり、添付イベントにハンドラーを添付するために、実際のイベント構文ではなく、アクセサー メソッドを使用する必要があります。You could choose to handle the attached event that initiated the process instead, but you would face several issues: the attached event may be marked handled by the base element class handling, and you need to use accessor methods rather than true event syntax in order to attach handlers for attached events.

次の内容What's Next

WPFWPFで入力を処理する幾つかの方法を学びました。You now have several techniques to handle input in WPFWPF. さまざまな種類の入力イベントやWPFWPFのルーティング イベントについて、 さらに理解を深める必要があります。You should also have an improved understanding of the various types of input events and the routed event mechanisms used by WPFWPF.

WPFWPFフレームワークの要素とイベント ルーティングの詳細については、 他のリソースを参照することができます。Additional resources are available that explain WPFWPF framework elements and event routing in more detail. 詳細については、「コマンド実行の概要」、 「フォーカスの概要」、 「基本要素の概要」、 「WPF のツリー」、 「ルーティング イベントの概要」を参照してください。See the following overviews for more information, Commanding Overview, Focus Overview, Base Elements Overview, Trees in WPF, and Routed Events Overview.

関連項目See also