讲述人未按预期阅读 TextBlock 中的文本。仅在选定的文本框中
Narrator does not read the text in a TextBlock as expected. Only in the selected TextBox
我有一个 Visual Studio 2019 解决方案,其中包含两个项目:一个 Class 库(通用 Windows),其中包含一个登录页面和一个空白应用程序(通用 Windows) 只是导航到所述登录页面。
我的一个要求是整个解决方案必须通过可访问性测试。测试涉及让讲述人(必须是讲述人)阅读屏幕上的所有文本。
我的问题是讲述人仅在页面加载时读取具有焦点的文本框的文本。我希望讲述人也能阅读 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" 等)。我还使用了检查工具来验证所有的文本框都出现在控件视图中。
我是不是漏掉了什么?
非常感谢任何帮助或建议。谢谢!
Narrator does not read the text in a as expected. Only in the selected TextBox
如果您想阅读TextBlock
的文字,请打开讲述人扫描模式。然后用方向键读出你在页面上选择的TextBlock
打开讲述人:Ctrl + Win + Enter
打开扫描模式:CapsLock + Spacebar
虽然不一定是最优雅的解决方案,但它可以满足我的需要。
我设置了最初以编程方式获得焦点的 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;
}
}
}
}
我希望这对其他人有帮助,我很乐意听到更好的解决方案。谢谢!
我有一个 Visual Studio 2019 解决方案,其中包含两个项目:一个 Class 库(通用 Windows),其中包含一个登录页面和一个空白应用程序(通用 Windows) 只是导航到所述登录页面。
我的一个要求是整个解决方案必须通过可访问性测试。测试涉及让讲述人(必须是讲述人)阅读屏幕上的所有文本。
我的问题是讲述人仅在页面加载时读取具有焦点的文本框的文本。我希望讲述人也能阅读 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" 等)。我还使用了检查工具来验证所有的文本框都出现在控件视图中。
我是不是漏掉了什么?
非常感谢任何帮助或建议。谢谢!
Narrator does not read the text in a as expected. Only in the selected TextBox
如果您想阅读TextBlock
的文字,请打开讲述人扫描模式。然后用方向键读出你在页面上选择的TextBlock
打开讲述人:Ctrl + Win + Enter
打开扫描模式:CapsLock + Spacebar
虽然不一定是最优雅的解决方案,但它可以满足我的需要。
我设置了最初以编程方式获得焦点的 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;
}
}
}
}
我希望这对其他人有帮助,我很乐意听到更好的解决方案。谢谢!