我们有一个 WPF 桌面应用程序,需要显示一些自定义消息窗口。我无法让屏幕阅读器(例如 Freedom Scientific 的 JAWS)正确朗读它们。
我想实现与显示系统消息框时相同的行为。为了比较,System.Windows.MessageBox.Show("my message", "My Caption);
JAWS 宣布为“我的标题对话框。我的消息。确定按钮”。太棒了。
当我的消息窗口打开时(仅包含TextBlock
and OK Button
),窗口标题被宣布,并且“确定”按钮被宣布为具有焦点,但TextBlock
消息未公布。
这是一个显示问题的简单测试应用程序。当然,我们真正的应用程序有图标和其他状态文本。
<Window x:Class="Jaws_MessageBox_Test.MyMessageBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Jaws_MessageBox_Test"
mc:Ignorable="d"
Title="MyMessageBox" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock x:Name="mainLabel" Grid.Row="0">Hi there, this is a test to see if JAWS will read the main textbloc when shown.</TextBlock>
<Button Grid.Row="1" Margin="5" HorizontalAlignment="Right" Padding="10,0,10,0" IsDefault="True" x:Name="closeButton" Click="closeButton_Click">_Close</Button>
</Grid>
</Window>
当我使用以下方式展示时:
var mb = new MyMessageBox();
mb.ShowDialog();
屏幕阅读器宣布:“MyMessageBox。关闭按钮”所以它不像系统消息框那样读取 TextBlock。
我使用 Windows SDK 发现了什么inspect
and accevent
工具是
系统消息框的辅助功能类型是“对话框”,但 WPF 对话框的辅助功能类型是“窗口”。这可能很重要。没有 UI 自动化控制类型的对话框https://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspx。这可能是 WPF 中的错误或限制吗?
我尝试在窗口上设置各种“AutomationProperties”附加属性,以便AutomationPeer
将有更好的信息,但当ShowDialog
runs.
Since TextBlock
无法接收输入焦点,甚至无法通过 Tab 键读取文本。我暂时用的是只读的TextBox
相反,为了获得焦点,但体验仍然是错误的,我们的盲人用户不应该仅仅为了让他们读到简单的状态消息而四处切换。
作为实验的一部分,我还尝试创建自己的派生AutomationPeer
对于消息窗口,但没有一个Core
启动对话框时会自动读取方法内容。自动化子列表确实将标题栏对象列为第一个子对象,而这是系统消息框的最后一个子对象,尽管我现在看不到更改它的方法。
我非常感谢任何帮助创建一个基于 WPF 的自定义消息框,为盲人用户提供完整、适当的可访问性。