C# 如何不将元素集中在应用程序启动上?
可能的最简单应用:C# 如何不将元素集中在应用程序启动上?,c#,.net,uwp,uwp-xaml,C#,.net,Uwp,Uwp Xaml,可能的最简单应用: <Page x:Class="TestApp.MainPage" ...> <Grid> <TextBox /> </Grid> </Page> 问:在应用程序启动时,有没有什么优雅的方法可以防止在文本框中设置光标(焦点) 扩展:我真正的问题是,当文本框接收焦点时,我会打开一个弹出窗口。如果我点击弹出窗口中的某个元素,它应该会关闭,但由于文本框是我页面中第一个可聚
<Page
x:Class="TestApp.MainPage"
...>
<Grid>
<TextBox />
</Grid>
</Page>
问:在应用程序启动时,有没有什么优雅的方法可以防止在文本框中设置光标(焦点)
扩展:我真正的问题是,当文本框接收焦点时,我会打开一个弹出窗口。如果我点击弹出窗口中的某个元素,它应该会关闭,但由于文本框是我页面中第一个可聚焦的元素,它会自动接收焦点,因此弹出窗口会立即再次打开。我认为问题的核心由上面的示例表示。焦点由各种属性管理,如
IsTabStop
,TabIndex
,ishitestvisible
,以及FocusManager
类。有一个内置的功能,可以在激活窗口后聚焦第一个可聚焦的元素,这种行为通常是不可自定义的
我们可以指定一个不同的元素作为焦点,而不是文本框,比如页面本身:
<Page IsTabStop="True">
<TextBox/>
</Page>
这是我所知道的防止文本框自动聚焦的最“优雅”的方法。您可以设置聚焦的元素是什么?或者文本框是你网站上唯一的控件吗?@HimBromBeere我想可以通过编程将焦点设置在文本框后面的下一行元素上。但我有一个(在我看来)相当武断且不那么优雅的解决方案。在最好的情况下,在我单击或按下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);
}