Windows Phone 8.1 XAML 应用程序。如何防止不适当的自动对焦改变?

Posted

技术标签:

【中文标题】Windows Phone 8.1 XAML 应用程序。如何防止不适当的自动对焦改变?【英文标题】:Windows Phone 8.1 XAML App. How to prevent inappropriate automatic focus change? 【发布时间】:2015-01-05 11:24:35 【问题描述】:

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

<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(即使我立即改变焦点,键盘也会出现很短的时间隐藏按钮后)。

我发现的第二种方法是在文本框之前的某处创建“不可见”按钮(评论 FocusHolder),这相当好,但看起来也不正确。

那么,那是什么?这是我可以以某种方式配置为从折叠元素“重定向”焦点的某种机制吗?或者它是一个错误?防止这种不受欢迎的自动对焦的正确方法是什么?

【问题讨论】:

【参考方案1】:

这是由于Tab 索引从按钮切换到文本框所致。这是WP8.1非常烦人的事情。我还没有找到一个“好的”解决方案,但这可能比你当前的解决方案更干净。

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;

祝你好运。

【讨论】:

感谢您提供另一个解决方案。在我的情况下,“隐形”按钮仍然是最好的解决方案,但有更多选择是件好事。似乎没有正确的解决方案,所以我要结束这个问题了。【参考方案2】:

我可以通过设置 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>

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Windows Phone 8.1 XAML 应用程序。如何防止不适当的自动对焦改变?的主要内容,如果未能解决你的问题,请参考以下文章

为 Windows Phone 8.1 XAML 应用程序显示的奇怪版本

如何在 Windows Phone 8.1 XAML (RT) 应用程序中显示 admob 广告?

Windows Phone 8.1 XAML 应用程序。如何防止不适当的自动对焦改变?

适用于 Windows Phone 8.1(无 XAML)的最小应用程序:与桌面应用程序的差异

如何在 C++ 运行时组件中的 Windows Phone 8.1 XAML 应用程序中使用 C++ dll

在 Windows Phone 8.1 XAML 中获取设备屏幕分辨率