2

我有一个包含两个项目的 Visual Studio 2019 解决方案:一个包含登录页面的类库(通用 Windows)和一个简单导航到所述登录页面的空白应用程序(通用 Windows)。

我的要求之一是整体解决方案必须通过可访问性测试。测试包括让讲述人(必须是讲述人)阅读屏幕上的所有文本。

我的问题是讲述人仅在页面加载时读取具有焦点的 TextBox 的文本。我希望讲述人也能阅读 Image 元素和 TextBlock 元素中的文本。这是我在页面中使用的 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>

作为健全性测试,我删除了两个 TextBox 元素以查看焦点是否是问题所在。在那种情况下,旁白没有说出屏幕上的任何文字。我还尝试更改几个 AutomationProperties 字段但无济于事(即 AccessibilityView="Control"、LiveSetting="Assertive" 等)。我还使用 Inspect 工具来验证所有 TextBox 是否都出现在 Control 视图中。

我错过了什么吗?

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

4

2 回答 2

2

讲述人未按预期阅读 a 中的文本。仅在选定的 TextBox 中

如果您想阅读 的文字TextBlock,请打开讲述人扫描模式。然后使用方向键阅读TextBlock您在页面上选择的内容。

打开讲述人:Ctrl+ Win+Enter

打开扫描模型:CapsLock+Spacebar

于 2019-05-29T03:28:53.507 回答
1

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

我设置了最初以编程方式获得焦点的 UserId TextBox 的 AutomationProperties.NameProperty,以包含我想要的 TextBlock 文本。由于我只想读取一次 TextBlock 文本,因此我保存了初始 NameProperty 值并在 UserId 随后获得焦点时将其设置回来。

我将 XAML 中的 UserId 更新为以下内容:

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

然后我更新相关的 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;
            }
        }
    }
}

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

于 2019-07-25T20:18:30.847 回答