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);
   }
}

注解

建议尽可能使用 UIElement 焦点路由事件,而不是 FocusManager 事件。

FocusManager 适用于应用程序中的特定元素不从 UIElement接收气泡事件的高级方案。 例如,视觉对象“覆盖”对象(如 弹出窗口工具提示,或 MenuFlyout 显示为应用 UI 的一部分,但实际上是它们自己的焦点范围,而不是可视化树层次结构的一部分。 对于 Popup,在以编程方式将 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,焦点从 Button1 移动到 Button5时,LosingFocusLostFocus 事件在可视化树(StackPanel1GridPage 获取这两个事件)。 但是,只有 StackPanel3 接收从 Button5GridPage 冒升的后续 GettingFocusGotFocus 事件,因为它们不在与 Popup的父子关系中)。

应用程序可以有多个具有逻辑焦点的元素(具体取决于焦点范围的数量)。 但是,应用程序中只有一个元素可以具有键盘焦点。

可以有多个具有逻辑焦点的元素,但每个焦点范围只有一个具有逻辑焦点的元素。 具有逻辑焦点的元素不一定具有键盘焦点,但具有键盘焦点的元素具有逻辑焦点。

方法

FindFirstFocusableElement(DependencyObject)

检索可基于指定范围接收焦点的第一个元素。

FindLastFocusableElement(DependencyObject)

检索可基于指定范围接收焦点的最后一个元素。

FindNextElement(FocusNavigationDirection, FindNextElementOptions)

检索应基于指定导航方向接收焦点的元素(不能与选项卡导航一起使用,请参阅备注)。

FindNextElement(FocusNavigationDirection)

检索应基于指定导航方向接收焦点的元素。

FindNextFocusableElement(FocusNavigationDirection, Rect)

检索应基于指定导航方向和提示矩形接收焦点的元素。

FindNextFocusableElement(FocusNavigationDirection)

检索应基于指定导航方向接收焦点的元素。

GetFocusedElement()

检索具有焦点的 UI 中的元素。

GetFocusedElement(XamlRoot)

检索 XAML 岛容器中的焦点元素。

TryFocusAsync(DependencyObject, FocusState)

异步尝试在初始化应用程序时将焦点设置为元素。

TryMoveFocus(FocusNavigationDirection, FindNextElementOptions)

尝试使用指定的导航选项,将焦点从具有焦点的元素更改为指定方向的下一个可聚焦元素。

TryMoveFocus(FocusNavigationDirection)

尝试将焦点从具有焦点的元素更改为指定方向的下一个可聚焦元素。

TryMoveFocusAsync(FocusNavigationDirection, FindNextElementOptions)

异步尝试将焦点从具有焦点的当前元素更改为指定方向的下一个可聚焦元素,并受指定导航选项的约束。

TryMoveFocusAsync(FocusNavigationDirection)

异步尝试将焦点从具有焦点的当前元素更改为指定方向的下一个可聚焦元素。

事件

GettingFocus

在元素实际接收焦点之前发生。 此事件是同步引发的,以确保事件在冒泡时不会移动焦点。

GotFocus

当容器元素(焦点范围)中的元素接收焦点时发生。 此事件是异步引发的,因此焦点可能会在浮泡完成之前移动。

LosingFocus

在焦点从具有焦点的当前元素移动到目标元素之前发生。 此事件是同步引发的,以确保事件在冒泡时不会移动焦点。

LostFocus

当容器元素(焦点范围)中的元素失去焦点时发生。 此事件异步引发,因此焦点可能会在浮泡完成之前再次移动。

适用于

另请参阅