Share via


FocusManager 클래스

정의

애플리케이션의 모든 요소에서 포커스 작업 및 이벤트를 전역으로 관리할 수 있는 도우미 클래스입니다.

public ref class FocusManager sealed
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class FocusManager final
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class FocusManager
Public NotInheritable Class FocusManager
상속
Object Platform::Object IInspectable FocusManager
특성

예제

TryMoveFocus를 사용하여 화살표 키를 사용하여 UI 요소 간을 트래버스합니다.

private void Page_KeyUp(object sender, KeyRoutedEventArgs e)
{
   if (e.Key == Windows.System.VirtualKey.Up)
   {
      // Mimic Shift+Tab when user hits up arrow key.
      FocusManager.TryMoveFocus(FocusNavigationDirection.Previous);
   }
   else if (e.Key == Windows.System.VirtualKey.Down)
   {
      // Mimic Tab when user hits down arrow key.
      FocusManager.TryMoveFocus(FocusNavigationDirection.Next);
   }
}

설명

가능하면 FocusManager 이벤트 대신 UIElement 포커스 라우트된 이벤트를 사용하는 것이 좋습니다.

FocusManager는 애플리케이션의 특정 요소가 UIElement에서 버블링된 이벤트를 수신하지 않는 고급 시나리오를 위한 것입니다. 예를 들어 Popup, Tooltip 또는 MenuFlyout과 같은 시각적 "오버레이" 개체는 앱 UI의 일부로 표시되지만 실제로는 시각적 트리 계층 구조의 일부가 아닌 scope 자체 포커스입니다. 팝업의 경우 프로그래밍 방식으로 IsOpen을 true로 설정하고 포커스가 팝업의 내/외부로 이동할 때 발생합니다.

다음은 예제를 설명하는 몇 가지 기본 태그입니다.

<Page …>
    <Grid …>
        <Popup …>
            <StackPanel Name="StackPanel3" …>
                <TextBlock Text="StackPanel3" />
                <Button Content="Button5" …/>
            </StackPanel>
        </Popup>
        <TextBlock Text="Grid" … />
        <StackPanel Name="StackPanel1" …>
            <TextBlock Text="StackPanel1" …/>
            <Button Content="Button1" …/>
            <Button Content="Button2" … />
        </StackPanel>
        <StackPanel Name="StackPanel2" …>
            <TextBlock Text="StackPanel2" …/>
            <Button Content="Button3" … />
            <Button Content="Button4" … />
        </StackPanel>
    </Grid>
</Page>

이 경우 에는 Popup 가 포함 StackPanel3되며, 에는 가 포함됩니다 Button5. IsOpen이 로 true 설정되고 포커스가 에서 로 Button1Button5LosingFocus 이동하면 및 LostFocus 이벤트가 시각적 트리(StackPanel1, Grid, 및 Page 이 두 이벤트 모두 가져오기)에 걸쳐 버블 업됩니다. 그러나 는 에서Grid 버블 업 Button5 되는 후속 GettingFocusGotFocus 이벤트만 StackPanel3 수신하며Page, 와 부모-자식 관계에 Popup없기 때문에 수신하지 않습니다.

애플리케이션에는 논리적 포커스가 있는 여러 요소가 있을 수 있습니다(포커스 범위 수에 따라 다름). 그러나 애플리케이션의 한 요소만 키보드 포커스를 가질 수 있습니다.

논리 포커스가 있는 요소는 여러 개 있을 수 있지만 포커스당 논리적 포커스가 있는 요소는 하나만 scope. 논리적 포커스가 있는 요소에 반드시 키보드 포커스가 있는 것은 아니지만 키보드 포커스가 있는 요소에는 논리적 포커스가 있습니다.

메서드

FindFirstFocusableElement(DependencyObject)

지정된 scope 따라 포커스를 받을 수 있는 첫 번째 요소를 검색합니다.

FindLastFocusableElement(DependencyObject)

지정된 scope 따라 포커스를 받을 수 있는 마지막 요소를 검색합니다.

FindNextElement(FocusNavigationDirection)

지정된 탐색 방향에 따라 포커스를 받아야 하는 요소를 검색합니다.

FindNextElement(FocusNavigationDirection, FindNextElementOptions)

지정된 탐색 방향에 따라 포커스를 받아야 하는 요소를 검색합니다(탭 탐색과 함께 사용할 수 없음, 설명 참조).

FindNextFocusableElement(FocusNavigationDirection)

지정된 탐색 방향에 따라 포커스를 받아야 하는 요소를 검색합니다.

FindNextFocusableElement(FocusNavigationDirection, Rect)

지정된 탐색 방향 및 힌트 사각형에 따라 포커스를 받아야 하는 요소를 검색합니다.

GetFocusedElement()

포커스가 있는 UI의 요소를 검색합니다.

GetFocusedElement(XamlRoot)

XAML 아일랜드 컨테이너 내에서 포커스가 있는 요소를 검색합니다.

TryFocusAsync(DependencyObject, FocusState)

애플리케이션이 초기화될 때 요소에 대한 포커스를 비동기적으로 설정하려고 시도합니다.

TryMoveFocus(FocusNavigationDirection)

포커스가 있는 요소에서 지정된 방향의 다음 포커스 가능 요소로 포커스를 변경하려고 시도합니다.

TryMoveFocus(FocusNavigationDirection, FindNextElementOptions)

지정된 탐색 옵션을 사용하여 포커스가 있는 요소에서 지정된 방향의 다음 포커스 가능 요소로 포커스를 변경하려고 시도합니다.

TryMoveFocusAsync(FocusNavigationDirection)

포커스가 있는 현재 요소에서 지정된 방향의 다음 포커스 가능 요소로 포커스를 비동기적으로 변경하려고 시도합니다.

TryMoveFocusAsync(FocusNavigationDirection, FindNextElementOptions)

포커스가 있는 현재 요소에서 지정된 방향의 다음 포커스 가능 요소로 포커스를 변경하고 지정된 탐색 옵션에 따라 포커스를 변경하려고 비동기적으로 시도합니다.

이벤트

GettingFocus

요소가 실제로 포커스를 받기 전에 발생합니다. 이 이벤트는 이벤트가 버블링되는 동안 포커스가 이동되지 않도록 동기적으로 발생합니다.

GotFocus

컨테이너 요소 내의 요소(포커스 scope)가 포커스를 받을 때 발생합니다. 이 이벤트는 비동기적으로 발생하므로 버블링이 완료되기 전에 포커스가 이동할 수 있습니다.

LosingFocus

포커스가 있는 현재 요소에서 대상 요소로 포커스가 이동하기 전에 발생합니다. 이 이벤트는 이벤트가 버블링되는 동안 포커스가 이동되지 않도록 동기적으로 발생합니다.

LostFocus

컨테이너 요소 내의 요소(포커스 scope)가 포커스를 잃을 때 발생합니다. 이 이벤트는 비동기적으로 발생하므로 버블링이 완료되기 전에 포커스가 다시 이동할 수 있습니다.

적용 대상

추가 정보