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 的气泡事件的高级方案。 例如,视觉对象“覆盖”对象(如 PopupTooltipMenuFlyout ),它们显示为应用 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 事件在可视化树 (StackPanel1上浮出, GridPage 获取这两个事件) 。 但是, 仅StackPanel3接收从Button5 (GridPage冒升的后续 GettingFocusGotFocus 事件,而不会接收这些事件,因为它们与) 不处于父子关系Popup中。

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

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

方法

FindFirstFocusableElement(DependencyObject)

检索可以根据指定范围接收焦点的第一个元素。

FindLastFocusableElement(DependencyObject)

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

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

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

LosingFocus

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

LostFocus

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

适用于

另请参阅