c# - 使屏幕阅读器可以访问 WPF 应用程序

标签 c# wpf xaml accessibility screen-readers

我有一个 WPF 应用程序,部分要求是它可以访问,包括键盘导航和屏幕阅读器。

通过在 Treeview 的 ItemContainerStyle 中设置 AutomationProperties.Name,我在应用程序中使用 Treeview 取得了一些成功,但我在使用包含文本区域和一些按钮的 Window 时遇到了问题。

ZoomText 将正确读出窗口的标题,但会读出两次,以及按钮中的文本,但我无法让它读取 TextBlock 的内容。

文本 block 在窗口中定义如下。调试时 Visual Studio 输出中没有显示绑定(bind)错误,NVDA 屏幕阅读器可以正确读取内容,尽管这对我来说还不够好,因为客户使用 ZoomText。

<Window x:Class="UserControls.ModalDialog"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         mc:Ignorable="d" 
         d:DesignHeight="160" d:DesignWidth="400" MinHeight="85" MinWidth="400" MaxWidth="400" SizeToContent="Height" Height="Auto"
        WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Title="{Binding TitleText }">
<DockPanel Width="Auto" Margin="20,20,0,10">
    <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Path=DialogText, Mode=TwoWay}" Cursor="Arrow" Focusable="True" TextWrapping="WrapWithOverflow"  
                       Height="Auto" Width="325" TextOptions.TextFormattingMode="Display"
                       ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}"
                       AutomationProperties.Name="{Binding Path=Text, RelativeSource={RelativeSource Self}}"
                       AutomationProperties.AutomationId="{Binding Path=Text, RelativeSource={RelativeSource Self}}">
            </TextBlock>
        </StackPanel>

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,5,0">
            <Button Content="{Binding Path=Option1ButtonText, Mode=TwoWay}" Padding="5,0,5,0" Margin="0,20,5,0" MinWidth="100" IsDefault="True" Command="{Binding Path=Option1ButtonCommand, Mode=TwoWay}" />
            <Button Content="{Binding Path=Option2ButtonText, Mode=TwoWay}" Padding="5,0,5,0"  Margin="2,20,10,0" MinWidth="75" Command="{Binding Path=Option2ButtonCommand, Mode=TwoWay}" Visibility="{Binding Option2ButtonVisibility, Mode=TwoWay}"/>
            <Button Content="{Binding Path=CancelButtonText, Mode=TwoWay}" Padding="5,0,5,0"  Margin="2,20,10,0" MinWidth="75" IsCancel="True" Visibility="{Binding CancelButtonVisibility, Mode=TwoWay}"/>
        </StackPanel>
    </StackPanel>
</DockPanel>

如果有人在 WPF 和屏幕阅读器方面取得了成功并且有任何见解,或者可以为我指明正确的方向,那就太好了。

更新:

问题似乎是因为 TextBlock 在另一个元素中。如果窗口具有 TextBlock 作为唯一元素,则屏幕阅读器可以正确读取文本。但是我需要 Dock 和 Stack 面板进行布局,所以我需要找到一种方法让屏幕阅读器在 TextBlock 不是窗口中唯一的内容时工作。

最佳答案

您可以使用 Automation Properties 完成几乎所有您需要的事情

例如;

有关使用的更多详细信息,请参阅文档。考虑到投票的数量,现在还没有回答这个问题,这有点令人惊讶。无论哪种方式,希望这会有所帮助。干杯!

关于c# - 使屏幕阅读器可以访问 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157400/

相关文章:

C# regex 无法通过管道分隔符拆分字符串

c# - 有没有办法确保 Orleans Grains 最终进入同一个筒仓

c# - XAML 设计器显示属性名称而不是设计器数据 (d :DataContext) when Binding

c# - WPF - ListView 的 ItemsSource 中的绑定(bind)不能是列表

wpf - 无法编辑我的 DataGrid WPF Framework 4.5 的单元格

c# - 显示来自 byte[ ] 的图像

c# - WPF 中的 DataBinding 有多灵活?

c# - 当构造函数抛出异常时确保定义明确的对象状态

c# - 当用户移动窗口时 PushFrame 锁定 WPF 窗口

WPF 设计器与转换器绑定(bind)抛出对象引用未设置为对象的实例