如何防止TextBlock自动获取焦点

5

我有以下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>

基本上,这个分割视图在用户按下按钮之前会被压缩,然后设置IsPaneOpen为true,从而显示我的应用程序菜单。

问题是,无论我做什么,搜索框似乎总是自动获取焦点。它获得焦点的事实会在手机上弹出触摸键盘,这非常烦人,并且会在小手机上隐藏大部分菜单。

我尝试使用TabIndex属性进行调整,为其分配一个巨大的数字或者给其他内容分配较低的索引。

我还尝试将IsTabStop设置为false,但似乎没有任何作用。

是否有一种简洁的方法来防止该框架自动获得焦点?(除了禁用/隐藏元素,然后再次启用/显示它)

3个回答

1
您可以尝试以下操作:

ListBox 命名:

<ListBox Name="MyListBox">

然后,在调用IsPaneOpentrue的地方,添加以下行:
Menu.IsPaneOpen = true;
MyListbox.Focus(FocusState.Programmatic);

这将把焦点转移到 ListBox 元素,并在打开 SplitView 时关闭键盘。

虽然这个解决方案对我有效,但我更喜欢Elvis的答案,因为我觉得它更加简洁。我试图完全避免使用C#代码。 - Dany Khalife

0

自动建议框内的文本框会自动获取焦点。

要解决这个问题,您可以通过编辑AutoSuggestBox的模板来实现:

点击“文档大纲”标签 -> 从文档树中选择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>

然后,它将停止自动获取焦点。


干净简洁的详细解释,我喜欢它!谢谢 - Dany Khalife
对于其他遇到这个问题的人,最终解决方法是给一个按钮(或者其他你不介意获取焦点的控件)设置TabIndex为2。这样就可以在启动时获取焦点了。 - HoloLady

-2
我只需将TabIndex设置为999,问题就解决了:
<AutoSuggestBox TabIndex="999" />

我之前尝试了接受的答案,但它导致无法完全获取焦点,即无法使用文本框(无法聚焦,没有弹出键盘等)。


踩反对并不仅是一种 hack 而不是修复,而且它也没有回答原来的问题。是的,"IsTabStop" 会防止元素获得焦点(名称有点明确),但是根据您的建议,您正在避免问题。现在我拥有更多的 XAML 知识,我相信最好的答案是 Justin 的,所以我现在选择那个答案。 - Dany Khalife
可能与问题不完全匹配,但我通过类似的问题找到了这个页面,并感谢该页面,我找到了解决方案。所以我认为其他人也可能会感兴趣。它对我有用,而且XAML解决方案通常比尝试手动克服和在程序中移动焦点更可靠。 - Mike Keskinov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接