Uwp导航示例并专注于控制

Fet*_*mos 7 c# xaml focus win-universal-app windows-10

我使用uwp导航示例作为我的应用程序导航的示例.我需要将重点放在TextBox上.我试试uwp导航示例.对于BasicPage,我添加以下代码:

   <StackPanel Orientation="Vertical">
        <TextBox x:Name="Test" />
        <TextBox x:Name="Test1" />
    </StackPanel>

    public BasicPage()
    {
        this.InitializeComponent();
        this.Loaded += BasicPage_Loaded;
    }

    private void BasicPage_Loaded(object sender, RoutedEventArgs e)
    {
        Test1.Focus(FocusState.Programmatic);
    }
Run Code Online (Sandbox Code Playgroud)

Test1没有得到关注.我在"普通"Windows通用应用程序中尝试此代码 - 这是工作.你有什么建议?

Ala*_*SFT 9

这是因为在调用Test1.Focus之后,在其他地方调用Focus函数.

在AppShell.xaml.cs中,您可以找到以下代码:

private void OnNavigatedToPage(object sender, NavigationEventArgs e)
{
    // After a successful navigation set keyboard focus to the loaded page
    if (e.Content is Page && e.Content != null)
    {
        var control = (Page)e.Content;
        control.Loaded += Page_Loaded;
    }
}

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    ((Page)sender).Focus(FocusState.Programmatic);
    ((Page)sender).Loaded -= Page_Loaded;
    this.CheckTogglePaneButtonSizeChanged();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码表示当您导航到页面时,它将订阅页面加载的事件并将焦点设置在页面上.

您的代码在页面本身中订阅页面加载的事件.您的代码将在AppShell中的Page_Loaded函数之前执行.所以你没有得到你想要的东西.

因此,如果您只是((Page)sender).Focus(FocusState.Programmatic);在Page_Loaded函数中注释掉.你会得到你想要的.我不确定那条线的确切目的是什么.但一切似乎都很好.

如果你在注释掉那一行后确实发现了什么问题,我们也可以解决它.加载事件后,在LayoutUpdated事件中调用焦点函数一次.

public sealed partial class BasicPage : Page
{
    bool bAfterLoaded = false;
    public BasicPage()
    {
        this.InitializeComponent();
        this.Loaded += BasicPage_Loaded;
        this.LayoutUpdated += BasicPage_LayoutUpdated;
    }

    private void BasicPage_LayoutUpdated(object sender, object e)
    {
        if (bAfterLoaded)
        {
            Test1.Focus(FocusState.Programmatic);
            bAfterLoaded = !bAfterLoaded;
        }
    }

    private void BasicPage_Loaded(object sender, RoutedEventArgs e)
    {
        bAfterLoaded = !bAfterLoaded;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮到你.