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

備註

建議您盡可能使用 UIElement 焦點路由事件,而不是 FocusManager 事件。

FocusManager 適用于應用程式中的特定元素不會從 UIElement接收泡泡事件的進階案例。 例如,顯示為應用程式 UI 一部分的 快顯工具提示MenuFlyout 等視覺「重迭」物件,但實際上是自己的焦點範圍,而不是視覺化樹狀結構階層的一部分。 如果是 快顯,當您以程式設計方式將 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 且焦點從 Button1Button5 移至 時, LosingFocusLostFocus 事件會反升到視覺化樹狀結構 (StackPanel1 、、 Grid 和 會 Page 取得這兩個事件) 。 不過,只會 StackPanel3 接收從 Button5 (GridPage 反升的後續 GettingFocusGotFocus 事件,因為它們不在與) 的 Popup 父子式關聯性中。

根據焦點範圍數目) 而定,應用程式可以有多個具有邏輯焦點 (的專案。 不過,應用程式中只有一個專案可以有鍵盤焦點。

可以有多個元素具有邏輯焦點,但每個焦點範圍只能有一個具有邏輯焦點的專案。 具有邏輯焦點的專案不一定具有鍵盤焦點,但具有鍵盤焦點的專案則具有邏輯焦點。

方法

FindFirstFocusableElement(DependencyObject)

擷取可以根據指定範圍接收焦點的第一個專案。

FindLastFocusableElement(DependencyObject)

擷取可以根據指定範圍接收焦點的最後一個專案。

FindNextElement(FocusNavigationDirection)

擷取應該根據指定的流覽方向接收焦點的專案。

FindNextElement(FocusNavigationDirection, FindNextElementOptions)

擷取應該根據指定的流覽方向接收焦點的專案, (無法與索引標籤流覽搭配使用,請參閱備註) 。

FindNextFocusableElement(FocusNavigationDirection)

擷取應該根據指定的流覽方向接收焦點的專案。

FindNextFocusableElement(FocusNavigationDirection, Rect)

擷取應該根據指定的流覽方向和提示矩形接收焦點的專案。

GetFocusedElement()

擷取 UI 中具有焦點的專案。

GetFocusedElement(XamlRoot)

擷取 XAML Island 容器內的焦點專案。

TryFocusAsync(DependencyObject, FocusState)

在初始化應用程式時,以非同步方式嘗試將焦點設定在專案上。

TryMoveFocus(FocusNavigationDirection)

嘗試將焦點從具有焦點的專案變更為指定方向的下一個可焦點專案。

TryMoveFocus(FocusNavigationDirection, FindNextElementOptions)

嘗試使用指定的導覽選項,將焦點從焦點專案變更為指定方向的下一個可焦點專案。

TryMoveFocusAsync(FocusNavigationDirection)

以非同步方式嘗試將焦點從具有焦點的目前專案變更為指定方向的下一個可設定焦點專案。

TryMoveFocusAsync(FocusNavigationDirection, FindNextElementOptions)

以非同步方式嘗試將焦點從具有焦點的目前元素變更為指定方向的下一個可焦點專案,並受限於指定的流覽選項。

事件

GettingFocus

發生在專案實際收到焦點之前。 此事件會同步引發,以確保事件反升時不會移動焦點。

GotFocus

發生于容器元素內的專案 (焦點範圍) 收到焦點時。 這個事件會以非同步方式引發,因此焦點可能會在反升完成之前移動。

LosingFocus

發生于焦點從具有焦點的目前專案移至目標元素之前。 此事件會同步引發,以確保事件反升時不會移動焦點。

LostFocus

發生于容器元素內的專案 (焦點範圍) 失去焦點時。 此事件會以非同步方式引發,因此焦點可能會在反升完成之前再次移動。

適用於

另請參閱