Windows Phone 8.1 XAML 应用程序。如何防止不恰当的自动调焦?

Windows Phone 8.1 XAML App. How to prevent inappropriate automatic focus change?

想象一下以下简单的页面标记:

<Page
    x:Class="AutoFocusBug.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <StackPanel>
        <!--<Button x:Name="FocusHolder" Width="0" Height="0" MinHeight="0" MinWidth="0"/>-->
        <TextBox Text="zxczczczczx"/>
        <Button x:Name="Button1" Content="Button1" Click="ButtonBase_OnClick"/>
    </StackPanel>
</Page>

和以下代码隐藏:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    Button1.Visibility = Visibility.Collapsed;
}

当我单击 Button1 按钮时它会隐藏(这是预期和期望的)但由于某种原因 TextBox 自动获得焦点并出现屏幕键盘。我不想要这种意外的自动对焦。

我可以尝试在 Click 处理程序中做一些有焦点的事情,但在真正的应用程序中,它是用 ViewModel 和命令等实现的,它看起来像肮脏的 hack(而且键盘也会出现很短的时间,即使我在隐藏按钮后立即改变焦点)。

我发现的第二种方法是在文本框之前的某处创建 "invisible" 按钮(注释 FocusHolder),这种方法要好得多,但看起来也不正确。

那么,那是什么?这是我可以以某种方式配置为 "redirect" 从折叠元素聚焦的某种机制吗?或者这是一个错误?防止这种不需要的自动对焦的正确方法是什么?

这是因为 Tab 索引从按钮切换到文本框。这是WP8.1非常烦人的事情。我还没有为此找到 "good" 解决方案,但这可能比您当前的解决方案更干净。

xaml

<TextBox x:Name="myTextBox" Text="zxczczczczx"/>

函数

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    myTextBox.IsTabStop = false;
    Button1.Visibility = Visibility.Collapsed;
    myTextBox.IsTabStop = true;
}

祝你好运。

我通过设置 TabIndex 解决了这个问题。

设置索引顺序以将焦点放在 TextBox 之前的第二个控件上。

<Page
x:Class="AutoFocusBug.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel>
    <!--<Button x:Name="FocusHolder" Width="0" Height="0" MinHeight="0" MinWidth="0"/>-->
    <TextBox Text="zxczczczczx" TabIndex="2"/>
    <Button x:Name="Button1" Content="Button1" Click="ButtonBase_OnClick" TabIndex="1"/>
</StackPanel>

尝试将 TabNavigation="Cycle" 设置为按钮。这对我有用。