最简单的应用:
<Page
x:Class="TestApp.MainPage"
...>
<Grid>
<TextBox />
</Grid>
</Page>
问题:是否有任何优雅的方法可以阻止在应用程序启动时在TextBox中设置光标(焦点)?
扩展:我的真正问题是我有一个在TextBox获得焦点时打开的PopUp。如果我单击我的PopUp中的一个元素它应该关闭,但由于TextBox是我页面中的第一个可聚焦元素,它会自动获得焦点,因此PopUp会立即再次打开。我认为问题的核心是上面的例子。
答案 0 :(得分:3)
焦点由各种属性管理,例如IsTabStop
,TabIndex
,IsHitTestVisible
和FocusManager
类。激活窗口后,内置的功能可以聚焦第一个可聚焦元素,而且这种行为通常无法自定义。
我们可以指定一个不同的元素来代替文本框,比如页面本身:
<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;我知道的方法是防止文本框自动聚焦。