포커스 개요Focus Overview

WPFWPF에는 포커스에 관한 두 가지 주요 개념이 있습니다. 즉, 키보드 포커스와 논리 포커스입니다.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. 키보드 포커스가 있는 전체 데스크탑에는 요소가 하나뿐이어야 합니다.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. 정적 속성 FocusedElementKeyboard 클래스는 현재 키보드 포커스가 있는 요소를 가져옵니다.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.

키보드 포커스는 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.

포커스를 받을 요소는 응용 프로그램이 로드 한 초기 창의 시각적 트리에 있어야 응용 프로그램 시작 시 초기 포커스를 설정 하는 경우 및 요소 있어야 Focusable 하 고 IsVisibletrue합니다.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. A Dispatcher 콜백을 호출 하 여 사용할 수도 있습니다 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.

애플리케이션에 논리 포커스가 있는 요소는 여러 개일 수 있지만, 특정 포커스 범위에 논리 포커스가 있는 요소는 하나뿐일 수 있습니다.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.

요소에서 포커스 범위로 변환할 수 있습니다 XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML) 설정 하 여는 FocusManager 연결 속성 IsFocusScopetrue합니다.An element can be turned into a focus scope in XAML(Extensible Application Markup Language)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. 탐색 키는 다음과 같습니다. 탭, SHIFT + TAB, CTRL + TAB, CTRL + SHIFT + TAB, 위쪽 화살표, 아래쪽 화살표, LEFTARROW 및 오른쪽 화살표 키입니다.The navigation keys are: TAB, SHIFT+TAB, CTRL+TAB, CTRL+SHIFT+TAB, UPARROW, DOWNARROW, LEFTARROW, and RIGHTARROW keys.

탐색 컨테이너의 탐색 동작은 연결을 설정 하 여 변경할 수 있습니다 KeyboardNavigation 속성 TabNavigation하십시오 ControlTabNavigation, 및 DirectionalNavigation합니다.The navigation behavior of a navigation container can be changed by setting the attached KeyboardNavigation properties TabNavigation, ControlTabNavigation, and DirectionalNavigation. 이러한 속성은 KeyboardNavigationMode 및 가능한 값은 Continue, Local, ContainedCycleOnce, 및 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 연결된 속성이로 설정 된 CycleMenu합니다.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)

추가 API 포커스를 사용 하 되 MoveFocusPredictFocus합니다.Additional API to work with focus are MoveFocus and PredictFocus.

MoveFocus 응용 프로그램의 다음 요소로 포커스를 변경 합니다.MoveFocus changes focus to the next element in the application. TraversalRequest 방향을 지정 하는 데 사용 됩니다.A TraversalRequest is used to specify the direction. 합니다 FocusNavigationDirection 전달할 MoveFocus 방향을 포커스를 이동할 수와 같은 지정 First, LastUpDown합니다.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. 현재만 Up, DownLeft, 및 RightPredictFocus합니다.Currently, only Up, Down, Left, and Right are supported by PredictFocus.

포커스 이벤트Focus Events

키보드 포커스와 관련 된 이벤트 PreviewGotKeyboardFocus, GotKeyboardFocus 하 고 PreviewLostKeyboardFocus, LostKeyboardFocus합니다.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.

다음 예제에서는 연결 GotKeyboardFocus 하 고 LostKeyboardFocus 이벤트 처리기에는 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. UIElementContentElement 더 편리 하 게 이러한 이벤트를 노출 합니다.UIElement and ContentElement expose these events more conveniently.

참고자료See also