フォーカスの概要Focus Overview

WPFWPF には、キーボード フォーカスと論理フォーカスという、フォーカスに関する 2 つの主要な概念があります。In WPFWPF there are two main concepts that pertain to focus: keyboard focus and logical focus. キーボード フォーカスはキーボード入力を受け取る要素を指し、論理フォーカスはフォーカスを持つフォーカス範囲内の要素を指します。Keyboard focus refers to the element that receives keyboard input and logical focus refers to the element in a focus scope that has focus. これらの概念については、この概要で詳しく説明します。These concepts are discussed in detail in this overview. フォーカスを取得可能な領域を複数持つ複雑なアプリケーションを作成する場合は、これらの概念の違いを理解することが重要です。Understanding the difference in these concepts is important for creating complex applications that have multiple regions where focus can be obtained.

フォーカス管理に参加する主要なクラスは、Keyboardクラス、FocusManagerクラス、および基本要素などのクラス、UIElementContentElementです。The major classes that participate in focus management are the Keyboard class, the FocusManager class, and the base element classes, such as UIElement and ContentElement. 基本要素の詳細については、「基本要素の概要」を参照してください。For more information about the base elements, see the Base Elements Overview.

Keyboardクラスでは、主にキーボード フォーカス、およびFocusManagerが論理フォーカスを中心に絶対の違いはありません。The Keyboard class is concerned primarily with keyboard focus and the FocusManager is concerned primarily with logical focus, but this is not an absolute distinction. キーボード フォーカスを持つ要素は論理フォーカスも持ちますが、論理フォーカスを持つ要素は必ずしもキーボード フォーカスを持ちません。An element that has keyboard focus will also have logical focus, but an element that has logical focus does not necessarily have keyboard focus. 使用するときにこれが明らかなもの、Keyboardにキーボード フォーカスを持つ要素を設定するクラスが要素にも論理フォーカスを設定します。This is apparent when you use the Keyboard class to set the element that has keyboard focus, for it also sets logical focus on the element.

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

キーボード フォーカスは、現在キーボード入力を受け取っている要素を指します。Keyboard focus refers to the element that is currently receiving keyboard input. キーボード フォーカスを持つ要素は、デスクトップ全体で 1 つしかありません。There can be only one element on the whole desktop that has keyboard focus. WPFWPF、キーボード フォーカスを持つ要素があるIsKeyboardFocused'éý'trueです。In WPFWPF, the element that has keyboard focus will have IsKeyboardFocused set to true. 静的プロパティFocusedElement上、Keyboardクラスがキーボード フォーカスされている要素を取得します。The static property FocusedElement on the Keyboard class gets the element that currently has keyboard focus.

キーボード フォーカスを取得する要素の順序で、FocusableIsVisibleに基本要素のプロパティを設定する必要がありますtrueです。In order for an element to obtain keyboard focus, the Focusable and the IsVisible properties on the base elements must be set to true. などのいくつかのクラス、Panel基底クラスは、 Focusable 'éý'false既定ではそのため、設定する必要ありますFocusabletrueする場合はこのような要素がキーボード フォーカスを取得できます。Some classes, such as the Panel base class, have Focusable set to false by default; therefore, you must set Focusable to true if you want such an element to be able to obtain keyboard focus.

キーボード フォーカスは、要素への Tab キーでの移動や特定の要素でのマウスのクリックなど、UIUI でのユーザー操作を通じて取得できます。Keyboard focus can be obtained through user interaction with the UIUI, such as tabbing to an element or clicking the mouse on certain elements. キーボード フォーカスも取得できますプログラムを使用して、FocusメソッドをKeyboardクラスです。Keyboard focus can also be obtained programmatically by using the Focus method on the Keyboard class. Focusメソッドが指定した要素にキーボード フォーカスを試みます。The Focus method attempts to give the specified element keyboard focus. 返される要素はキーボード フォーカスが設定された要素ですが、古いフォーカス オブジェクトまたは新しいフォーカス オブジェクトが要求をブロックする場合は、要求された要素とは異なる可能性があります。The returned element is the element that has keyboard focus, which might be a different element than requested if either the old or new focus object block the request.

次の例では、Focusキーボード フォーカスを設定する方法、Buttonです。The following example uses the Focus method to set keyboard focus on a Button.

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

IsKeyboardFocused基本要素クラスのプロパティは、要素にキーボード フォーカスがあるかどうかを示す値を取得します。The IsKeyboardFocused property on the base element classes gets a value indicating whether the element has keyboard focus. IsKeyboardFocusWithin基本要素クラスのプロパティは、要素またはその子ビジュアル要素のいずれかにキーボード フォーカスがあるかどうかを示す値を取得します。The IsKeyboardFocusWithin property on the base element classes gets a value indicating whether the element or any one of its visual child elements has keyboard focus.

フォーカスを受け取る要素が、アプリケーションによって読み込まれる最初のウィンドウのビジュアル ツリー内でなければなりませんにアプリケーションの起動時に初期フォーカスを設定するときと、要素がありますFocusableIsVisible'éý'trueです。When setting initial focus at application startup, the element to receive focus must be in the visual tree of the initial window loaded by the application, and the element must have Focusable and IsVisible set to true. 初期フォーカスを設定することをお勧めの場所は、Loadedイベント ハンドラー。The recommended place to set initial focus is in the Loaded event handler. ADispatcherコールバックは、呼び出すことによっても使用できますInvokeまたはBeginInvokeです。A Dispatcher callback can also be used by calling Invoke or BeginInvoke.

論理フォーカスLogical Focus

論理フォーカスとは、FocusManager.FocusedElementフォーカス範囲内です。Logical focus refers to the FocusManager.FocusedElement in a focus scope. フォーカス範囲を追跡する要素とは、FocusedElementそのスコープ内で。A focus scope is an element that keeps track of the FocusedElement within its scope. キーボード フォーカスがフォーカス範囲を離れると、フォーカスがある要素はキーボード フォーカスを失いますが、論理フォーカスは引き続き保持します。When keyboard focus leaves a focus scope, the focused element will lose keyboard focus but will retain logical focus. キーボード フォーカスがフォーカス範囲に戻ると、フォーカスがある要素はキーボード フォーカスを取得します。When keyboard 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 ensures that the focused element in the focus scope regains keyboard focus when focus returns to the 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.

キーボード フォーカスを持つ要素は、その要素が属するフォーカス範囲の論理フォーカスを持ちます。An element that has keyboard focus has logical focus for the focus scope it belongs to.

フォーカス範囲に要素を変換できるExtensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)を設定して、FocusManager添付プロパティIsFocusScopetrueです。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. コードでは、要素に変換できるフォーカス スコープを呼び出してSetIsFocusScopeです。In code, an element can be turned into a focus scope by calling SetIsFocusScope.

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

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

GetFocusScope 指定した要素のフォーカス スコープを返します。GetFocusScope returns the focus scope for the specified element.

内のクラスWPFWPFは既定でフォーカス範囲はWindowMenuItemToolBar、およびContextMenuです。Classes in WPFWPF which are focus scopes by default are Window, MenuItem, ToolBar, and ContextMenu.

GetFocusedElement 指定したフォーカスの範囲のフォーカスがある要素を取得します。GetFocusedElement gets the focused element for the specified focus scope. SetFocusedElement 指定したフォーカスのスコープ内には、フォーカスのある要素を設定します。SetFocusedElement sets the focused element in the specified focus scope. SetFocusedElement 初期フォーカスのある要素の設定に通常使用されます。SetFocusedElement is typically used to set the initial focused element.

フォーカス範囲にフォーカスを持つ要素を設定し、フォーカス範囲のフォーカスを持つ要素を取得する例を次に示します。The following example sets the focused element on a focus scope and gets the focused element of a focus scope.

// Sets the focused element in focusScope1
// focusScope1 is a StackPanel.
FocusManager.SetFocusedElement(focusScope1, button2);

// Gets the focused element for focusScope 1
IInputElement focusedElement = FocusManager.GetFocusedElement(focusScope1);
' Sets the focused element in focusScope1
' focusScope1 is a StackPanel.
FocusManager.SetFocusedElement(focusScope1, button2)

' Gets the focused element for focusScope 1
Dim focusedElement As IInputElement = FocusManager.GetFocusedElement(focusScope1)

キーボード ナビゲーションKeyboard Navigation

KeyboardNavigationクラスは、のいずれかのナビゲーション キーが押されたときに既定のキーボード フォーカスのナビゲーションの実装を担当します。The KeyboardNavigation class is responsible for implementing default keyboard focus navigation when one of the navigation keys is pressed. ナビゲーション キーとは、Tab、Shift + Tab、Ctrl + Tab、Ctrl + Shift + Tab、上方向、下方向、左方向、および右方向の各キーを指します。The navigation keys are: TAB, SHIFT+TAB, CTRL+TAB, CTRL+SHIFT+TAB, UPARROW, DOWNARROW, LEFTARROW, and RIGHTARROW keys.

アタッチされたを設定してナビゲーション コンテナーのナビゲーション動作を変更できますKeyboardNavigationプロパティTabNavigationControlTabNavigation、およびDirectionalNavigationです。The navigation behavior of a navigation container can be changed by setting the attached KeyboardNavigation properties TabNavigation, ControlTabNavigation, and DirectionalNavigation. これらのプロパティが型KeyboardNavigationMode値には、 ContinueLocalContainedCycleOnce、およびNoneです。These properties are of type KeyboardNavigationMode and the possible values are Continue, Local, Contained, Cycle, Once, and None. 既定値はContinue、つまり、要素はナビゲーション コンテナーではありません。The default value is Continue, which means the element is not a navigation container.

次の例を作成、Menuの数がMenuItemオブジェクト。The following example creates a Menu with a number of MenuItem objects. TabNavigationに添付プロパティを設定Cycle上、Menuです。The TabNavigation attached property is set to Cycle on the Menu. 内で tab キーを使用して、フォーカスが変更されたときに、Menu最初の要素にフォーカスが戻ります最後の要素に達したときに、フォーカスは各要素から移動します。When focus is changed using the tab key within the Menu, focus will move from each element and when the last element is reached focus will return to the first element.

<Menu KeyboardNavigation.TabNavigation="Cycle">
  <MenuItem Header="Menu Item 1" />
  <MenuItem Header="Menu Item 2" />
  <MenuItem Header="Menu Item 3" />
  <MenuItem Header="Menu Item 4" />
</Menu>
Menu navigationMenu = new Menu();
MenuItem item1 = new MenuItem();
MenuItem item2 = new MenuItem();
MenuItem item3 = new MenuItem();
MenuItem item4 = new MenuItem();

navigationMenu.Items.Add(item1);
navigationMenu.Items.Add(item2);
navigationMenu.Items.Add(item3);
navigationMenu.Items.Add(item4);

KeyboardNavigation.SetTabNavigation(navigationMenu, 
    KeyboardNavigationMode.Cycle);
Dim navigationMenu As New Menu()
Dim item1 As New MenuItem()
Dim item2 As New MenuItem()
Dim item3 As New MenuItem()
Dim item4 As New MenuItem()

navigationMenu.Items.Add(item1)
navigationMenu.Items.Add(item2)
navigationMenu.Items.Add(item3)
navigationMenu.Items.Add(item4)

KeyboardNavigation.SetTabNavigation(navigationMenu, KeyboardNavigationMode.Cycle)

追加APIAPIを操作するにはフォーカスがMoveFocusPredictFocusです。Additional APIAPI to work with focus are MoveFocus and PredictFocus.

MoveFocus アプリケーションで次の要素にフォーカスを変更します。MoveFocus changes focus to the next element in the application. ATraversalRequest方向を指定するために使用します。A TraversalRequest is used to specify the direction. FocusNavigationDirectionに渡されるMoveFocus異なる方向フォーカスが移動可能などを示すFirstLastUpDownです。The FocusNavigationDirection passed to MoveFocus specifies the different directions focus can be moved, such as First, Last, Up and Down.

次の例ではMoveFocusフォーカスのある要素を変更します。The following example uses MoveFocus to change the focused element.

// Creating a FocusNavigationDirection object and setting it to a
// local field that contains the direction selected.
FocusNavigationDirection focusDirection = _focusMoveValue;

// MoveFocus takes a TraveralReqest as its argument.
TraversalRequest request = new TraversalRequest(focusDirection);

// Gets the element with keyboard focus.
UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

// Change keyboard focus.
if (elementWithFocus != null)
{
    elementWithFocus.MoveFocus(request);
}
' Creating a FocusNavigationDirection object and setting it to a
' local field that contains the direction selected.
Dim focusDirection As FocusNavigationDirection = _focusMoveValue

' MoveFocus takes a TraveralReqest as its argument.
Dim request As New TraversalRequest(focusDirection)

' Gets the element with keyboard focus.
Dim elementWithFocus As UIElement = TryCast(Keyboard.FocusedElement, UIElement)

' Change keyboard focus.
If elementWithFocus IsNot Nothing Then
	elementWithFocus.MoveFocus(request)
End If

PredictFocus フォーカスが変更された場合、フォーカスを受け取るオブジェクトを返します。PredictFocus returns the object which would receive focus if focus were to be changed. 現時点では、のみUpDownLeft、およびRightでサポートされているPredictFocusです。Currently, only Up, Down, Left, and Right are supported by PredictFocus.

フォーカス イベントFocus Events

キーボード フォーカスに関連するイベントはPreviewGotKeyboardFocusGotKeyboardFocusPreviewLostKeyboardFocusLostKeyboardFocusです。The events related to keyboard focus are PreviewGotKeyboardFocus, GotKeyboardFocus and PreviewLostKeyboardFocus, LostKeyboardFocus. アタッチされるイベントとイベントが定義されている、Keyboardクラスしますが、基本要素クラスの同等のルーティング イベントとしてより簡単にアクセスできます。The events are defined as attached events on the Keyboard class, but are more readily accessible as equivalent routed events on the base element classes. イベントの詳細については、「ルーティング イベントの概要」を参照してください。For more information about events, see the Routed Events Overview.

GotKeyboardFocus 要素がキーボード フォーカスを取得したときに発生します。GotKeyboardFocus is raised when the element obtains keyboard focus. LostKeyboardFocus 要素がキーボード フォーカスを失ったときに発生します。LostKeyboardFocus is raised when the element loses keyboard focus. 場合、PreviewGotKeyboardFocusイベントまたはPreviewLostKeyboardFocusEventイベントが処理されるとHandledに設定されているtrue、フォーカスは変わりません。If the PreviewGotKeyboardFocus event or the PreviewLostKeyboardFocusEvent event is handled and Handled is set to true, then focus will not change.

次の例ではアタッチGotKeyboardFocusLostKeyboardFocusへのイベント ハンドラー、TextBoxです。The following example attaches GotKeyboardFocus and LostKeyboardFocus event handlers to a TextBox.

<Border BorderBrush="Black" BorderThickness="1"
        Width="200" Height="100" Margin="5">
  <StackPanel>
    <Label HorizontalAlignment="Center" Content="Type Text In This TextBox" />
    <TextBox Width="175"
             Height="50" 
             Margin="5"
             TextWrapping="Wrap"
             HorizontalAlignment="Center"
             VerticalScrollBarVisibility="Auto"
             GotKeyboardFocus="TextBoxGotKeyboardFocus"
             LostKeyboardFocus="TextBoxLostKeyboardFocus"
             KeyDown="SourceTextKeyDown"/>
  </StackPanel>
</Border>

ときに、TextBoxがキーボード フォーカスを取得、Backgroundのプロパティ、TextBoxに変更がLightBlueです。When the TextBox obtains keyboard focus, the Background property of the TextBox is changed to LightBlue.

private void TextBoxGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    TextBox source = e.Source as TextBox;

    if (source != null)
    {
        // Change the TextBox color when it obtains focus.
        source.Background = Brushes.LightBlue;

        // Clear the TextBox.
        source.Clear();
    }
}
Private Sub TextBoxGotKeyboardFocus(ByVal sender As Object, ByVal e As KeyboardFocusChangedEventArgs)
	Dim source As TextBox = TryCast(e.Source, TextBox)

	If source IsNot Nothing Then
		' Change the TextBox color when it obtains focus.
		source.Background = Brushes.LightBlue

		' Clear the TextBox.
		source.Clear()
	End If
End Sub

ときに、TextBoxがキーボード フォーカスを失った、Backgroundのプロパティ、TextBox白に変更します。When the TextBox loses keyboard focus, the Background property of the TextBox is changed back to white.

private void TextBoxLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    TextBox source = e.Source as TextBox;

    if (source != null)
    {
        // Change the TextBox color when it loses focus.
        source.Background = Brushes.White;

        // Set the  hit counter back to zero and updates the display.
        this.ResetCounter();
    }
}
Private Sub TextBoxLostKeyboardFocus(ByVal sender As Object, ByVal e As KeyboardFocusChangedEventArgs)
	Dim source As TextBox = TryCast(e.Source, TextBox)

	If source IsNot Nothing Then
		' Change the TextBox color when it loses focus.
		source.Background = Brushes.White

		' Set the  hit counter back to zero and updates the display.
		Me.ResetCounter()
	End If
End Sub

論理フォーカスに関連するイベントはGotFocusLostFocusです。The events related to logical focus are GotFocus and LostFocus. これらのイベントがで定義された、FocusManagerとしてアタッチされるイベントは、ですが、 FocusManager CLR イベントのラッパーを公開しません。These events are defined on the FocusManager as attached events, but the FocusManager does not expose CLR event wrappers. UIElement およびContentElementこれらのイベントをより簡単に公開します。UIElement and ContentElement expose these events more conveniently.

関連項目See Also

FocusManager
UIElement
ContentElement
入力の概要Input Overview
基本要素の概要Base Elements Overview