如何防止TextBlock获得自动焦点
How to prevent TextBlock from getting automatic focus
我有以下 XAML 摘录:
<SplitView Name="Menu" DisplayMode="CompactOverlay" OpenPaneLength="200" CompactPaneLength="0" Grid.RowSpan="2">
<SplitView.Pane>
<StackPanel>
<AutoSuggestBox Margin="0,20,0,20" Width="170" PlaceholderText="Search" QueryIcon="Find"></AutoSuggestBox>
<ListBox>
<ListBoxItem Tapped="Projects_Tapped">
<StackPanel Orientation="Horizontal">
<SymbolIcon Symbol="Library" />
<TextBlock Margin="10,0,0,0">Projects</TextBlock>
</StackPanel>
</ListBoxItem>
[....]
</ListBox>
</StackPanel>
</SplitView.Pane>
</SplitView>
基本上,这个 splitview 会被压缩,直到用户按下一个按钮,然后将 IsPaneOpen
设置为 true,这反过来会显示我的应用程序菜单。
问题是,我在菜单中首先看到的是搜索框,无论我做什么,它似乎都会自动聚焦。它有焦点的事实然后会在手机上调出触摸键盘,这非常烦人并且隐藏了小手机上的大部分菜单。
我尝试使用 TabIndex
属性 来给它一个很大的数字,或者甚至为其他东西设置一个较低的索引。
我也尝试将 IsTabStop
设置为 false,但似乎没有任何效果。
有没有一种干净的方法来防止盒子自动获得焦点? (除了禁用/隐藏元素然后再次启用/显示它)
您可以尝试以下方法:
给ListBox
一个名字:
<ListBox Name="MyListBox">
然后,在调用 IsPaneOpen
到 true
的地方添加以下行:
Menu.IsPaneOpen = true;
MyListbox.Focus(FocusState.Programmatic);
这会将焦点更改为 ListBox
元素并在您打开 SplitView
时关闭键盘。
自动获取焦点的是 AutoSuggestBox 中的 TextBox。
要解决此问题,您可以通过以下方式编辑 AutoSuggestBox 的模板:
单击'Document Outline' 标签->从文档树中选择 AutoSuggestBox 元素->右键单击->编辑模板->编辑副本。
然后 VS 会将模板添加到您的页面资源中。将 IsTabStop="False"
添加到模板中的文本框,如下所示:
<ControlTemplate TargetType="AutoSuggestBox">
<Grid>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
<TextBox x:Name="TextBox" IsTabStop="False" ScrollViewer.BringIntoViewOnFocusChange="False" DesiredCandidateWindowAlignment="BottomEdge" Header="{TemplateBinding Header}" Margin="0" PlaceholderText="{TemplateBinding PlaceholderText}" Style="{TemplateBinding TextBoxStyle}" Width="{TemplateBinding Width}" Canvas.ZIndex="0"/>
<Popup x:Name="SuggestionsPopup">
...
</Popup>
</Grid>
</ControlTemplate>
然后,它将停止自动获取焦点。
我简单地将 TabIndex 设置为 999,这解决了我的问题:
<AutoSuggestBox TabIndex="999" />
在我尝试接受答案之前,但这会导致无法完全获得焦点,即根本无法使用文本框(无法专注于它,没有弹出键盘等)。
我有以下 XAML 摘录:
<SplitView Name="Menu" DisplayMode="CompactOverlay" OpenPaneLength="200" CompactPaneLength="0" Grid.RowSpan="2">
<SplitView.Pane>
<StackPanel>
<AutoSuggestBox Margin="0,20,0,20" Width="170" PlaceholderText="Search" QueryIcon="Find"></AutoSuggestBox>
<ListBox>
<ListBoxItem Tapped="Projects_Tapped">
<StackPanel Orientation="Horizontal">
<SymbolIcon Symbol="Library" />
<TextBlock Margin="10,0,0,0">Projects</TextBlock>
</StackPanel>
</ListBoxItem>
[....]
</ListBox>
</StackPanel>
</SplitView.Pane>
</SplitView>
基本上,这个 splitview 会被压缩,直到用户按下一个按钮,然后将 IsPaneOpen
设置为 true,这反过来会显示我的应用程序菜单。
问题是,我在菜单中首先看到的是搜索框,无论我做什么,它似乎都会自动聚焦。它有焦点的事实然后会在手机上调出触摸键盘,这非常烦人并且隐藏了小手机上的大部分菜单。
我尝试使用 TabIndex
属性 来给它一个很大的数字,或者甚至为其他东西设置一个较低的索引。
我也尝试将 IsTabStop
设置为 false,但似乎没有任何效果。
有没有一种干净的方法来防止盒子自动获得焦点? (除了禁用/隐藏元素然后再次启用/显示它)
您可以尝试以下方法:
给ListBox
一个名字:
<ListBox Name="MyListBox">
然后,在调用 IsPaneOpen
到 true
的地方添加以下行:
Menu.IsPaneOpen = true;
MyListbox.Focus(FocusState.Programmatic);
这会将焦点更改为 ListBox
元素并在您打开 SplitView
时关闭键盘。
自动获取焦点的是 AutoSuggestBox 中的 TextBox。
要解决此问题,您可以通过以下方式编辑 AutoSuggestBox 的模板:
单击'Document Outline' 标签->从文档树中选择 AutoSuggestBox 元素->右键单击->编辑模板->编辑副本。
然后 VS 会将模板添加到您的页面资源中。将 IsTabStop="False"
添加到模板中的文本框,如下所示:
<ControlTemplate TargetType="AutoSuggestBox">
<Grid>
<VisualStateManager.VisualStateGroups>
...
</VisualStateManager.VisualStateGroups>
<TextBox x:Name="TextBox" IsTabStop="False" ScrollViewer.BringIntoViewOnFocusChange="False" DesiredCandidateWindowAlignment="BottomEdge" Header="{TemplateBinding Header}" Margin="0" PlaceholderText="{TemplateBinding PlaceholderText}" Style="{TemplateBinding TextBoxStyle}" Width="{TemplateBinding Width}" Canvas.ZIndex="0"/>
<Popup x:Name="SuggestionsPopup">
...
</Popup>
</Grid>
</ControlTemplate>
然后,它将停止自动获取焦点。
我简单地将 TabIndex 设置为 999,这解决了我的问题:
<AutoSuggestBox TabIndex="999" />
在我尝试接受答案之前,但这会导致无法完全获得焦点,即根本无法使用文本框(无法专注于它,没有弹出键盘等)。