如何不关注应用程序启动的元素?

时间:2016-12-16 10:45:32

标签: c# .net uwp uwp-xaml

最简单的应用:

<Page
    x:Class="TestApp.MainPage"
    ...>
    <Grid>
        <TextBox />
    </Grid>
</Page>

问题:是否有任何优雅的方法可以阻止在应用程序启动时在TextBox中设置光标(焦点)?

扩展:我的真正问题是我有一个在TextBox获得焦点时打开的PopUp。如果我单击我的PopUp中的一个元素它应该关闭,但由于TextBox是我页面中的第一个可聚焦元素,它会自动获得焦点,因此PopUp会立即再次打开。我认为问题的核心是上面的例子。

1 个答案:

答案 0 :(得分:3)

焦点由各种属性管理,例如IsTabStopTabIndexIsHitTestVisibleFocusManager类。激活窗口后,内置的功能可以聚焦第一个可聚焦元素,而且这种行为通常无法自定义。

我们可以指定一个不同的元素来代替文本框,比如页面本身:

<Page IsTabStop="True">
    <TextBox/>
</Page>

这可以使页面获得初始焦点而不是文本框,但现在页面参与了Tab键行为,这有点不可取。

通常,当您单击一个聚焦控件时,框架会将焦点设置为RootScrollViewer,即使RootScrollViewer不是制表位(因此它不能通过Tab键获得焦点)。如果我们可以在页面加载时关注RootScrollViewer,框架将检测某些内容具有焦点并且不会尝试聚焦第一个元素。

<Page Loaded="onPageLoaded">
    <TextBox/>
</Page>
private ScrollViewer getRootScrollViewer()
{
    DependencyObject el = this;
    while (el != null && !(el is ScrollViewer))
    {
        el = VisualTreeHelper.GetParent(el);
    }

    return (ScrollViewer)el;
}

private void onPageLoaded(object sender, RoutedEventArgs e)
{
    getRootScrollViewer().Focus(FocusState.Programmatic);
}

这是最优雅的#34;我知道的方法是防止文本框自动聚焦。