叙述者不会在预期的文本块中读取文本.仅在选定的文本框中



我有一个Visual Studio 2019解决方案,其中包含两个项目:一个class Library(通用窗口(,其中包含登录页面和空白应用程序(通用窗口(,该应用程序简单地导航到上述登录页面。

我的要求之一是总体解决方案必须通过可访问性测试。该测试涉及让叙述者(必须是叙述者(读取屏幕上的所有文本。

我的问题是,叙述者仅读取页面加载时焦点的文本框的文本。我希望叙述者还可以阅读图像元素和文本块元素中的文本。这是我在页面中使用的XAML的删节版本:

<Page>
    <RelativePanel>
        <Image
             x:Name="Logo"
             AutomationProperties.Name="Logo"/>
        <TextBlock
             x:Name="WelcomeTo"
             x:Uid="WelcomeTo"
             Text="Welcome to" />
        <TextBlock
             x:Name="ServiceName"
             x:Uid="ServiceName"
             Text="Service Name" />
        <TextBox
             x:Name="UserId"
             x:Uid="UserId"
             PlaceholderText="User ID"/>
        <TextBox
             x:Name="Password"
             x:Uid="Password"
             PlaceholderText="Password"/>
        <Button
             x:Name="SignIn"
             x:Uid="SignIn"
             Content="Sign In"/>
        <TextBlock
             x:Name="Footer"
             x:Uid="Footer"
             Text="Footer Text" />
    </RelativePanel>
</Page>

作为理智测试,我删除了两个文本框元素,以查看焦点是否是问题。在这种情况下,叙述者没有从屏幕上说任何文字。我还尝试将几个AutomationProperties字段更改为无用(即AscessibilityView =" Control",LivesEtting ="自信"等(。我还使用"检查工具"来验证所有文本框都出现在控制视图中。

我错过了什么吗?

任何帮助或建议都非常感谢。谢谢!

叙述者不会按预期阅读文本。仅在选定的文本框中

如果要读取TextBlock的文本,请打开旁白扫描模式。然后使用方向密钥读取您在页面上选择的TextBlock

打开叙述者: ctrl win enter

转扫描模型: capslock spacebar

虽然不一定是最优雅的解决方案,但这适合我需要做的事情。

我设置了用户ID文本框的automationproperties.nameproperty,该文本框最初以编程方式将焦点以包含我想要的文本block文本。由于我只希望读取一次文本文本,因此我保存初始名称property值并在用户ID随后获得焦点时将其设置回。

我将XAML中的用户ID更新为以下:

<TextBox
         x:Name="UserId"
         x:Uid="UserId"
         PlaceholderText="User ID"
         GotFocus="UserId_GotFocus"/>

i然后,如下更新相关的C#文件:

namespace my_namespace
{
    public sealed partial class LoginPage : Page
    {
        private bool hasFullTextBeenRead = false;
        private object userIdNameProperty = null;
        private void UserId_GotFocus(object sender, RoutedEventArgs e)
        {
            if (hasFullTextBeenRead)
            {
                UserId.SetValue(AutomationProperties.NameProperty, userIdNameProperty);
            }
            else
            {
                userIdNameProperty = UserId.GetValue(AutomationProperties.NameProperty);
                UserId.SetValue(AutomationProperties.NameProperty, 
                    // Add a period so Narrator pauses after reading the logo name.
                    FrameworkElementAutomationPeer.FromElement(Logo)?.GetName() + ". " + 
                    FrameworkElementAutomationPeer.FromElement(WelcomeTo)?.GetName() + " " + 
                    // Add a period so Narrator pauses after reading the service name.
                    FrameworkElementAutomationPeer.FromElement(ServiceName)?.GetName() + ". " + 
                    // Add a period so Narrator pauses after reading the footer.
                    FrameworkElementAutomationPeer.FromElement(Footer)?.GetName() + ". " + 
                    FrameworkElementAutomationPeer.FromElement(UserId)?.GetName());
                hasFullTextBeenRead = true;
            }
        }
    }
}

我希望这对别人有帮助,我很想听听更好的解决方案。谢谢!

相关内容

  • 没有找到相关文章

最新更新