WPF TextBlock内容无法被屏幕阅读器读取

3
我有一个应用程序,其中包含自定义的WPF窗口,用于显示类似于Win32 MessageBox的弹出窗口。
作为要求的一部分,该应用程序必须通过屏幕阅读器(特别是JAWS)进行访问。我在让屏幕阅读器读取对话框中的文本方面遇到了问题,但它可以正常读取按钮中的值。
XAML中的代码如下:
<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"
         xmlns:converters="clr-namespace:UserControls.Converters"
         mc:Ignorable="d" 
         d:DesignHeight="160" d:DesignWidth="400" MinHeight="85" MinWidth="400" MaxWidth="400" SizeToContent="Height" Height="Auto"
        WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Title="Popup Dialog">

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <StackPanel.Resources>
            <converters:DisplayIconToSystemIconConverter x:Key="DisplayIconToSystemIconConverter"/>
        </StackPanel.Resources>
        <Image Source="{Binding IconType, Converter={StaticResource DisplayIconToSystemIconConverter}}" Height="32" Width="32" Margin="0,0,10,0"/>
        <TextBlock Name="TextBlock" Margin="20,10,0,0" TextWrapping="Wrap" Width="350" Foreground="DarkSlateGray" FontSize="10" FontWeight="Normal">
            <Run Text="Some text in the dialog"/>
        </TextBlock>
    </StackPanel>

    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10,5,0">
        <Button Name="Option1Button" Content="OK" Padding="5,0,5,0" Margin="0,20,5,0" MinWidth="100" IsDefault="True" />
        <Button Cancel Padding="5,0,5,0"  Margin="2,20,10,0" MinWidth="75" IsCancel="True" Visibility="Visible"/>
    </StackPanel>
</StackPanel></Window>

这段代码在被调用时能够正确显示弹出窗口,但屏幕阅读器只会读取标题两次。如果我在TextBlock后面添加一个空的ListView控件,屏幕阅读器会正确地读取对话框文本,尽管这两个控件没有被显式地连接,但是我不能在控件中再添加额外的控件,因为这会影响布局。有没有一种方法让屏幕阅读器在没有ListView控件时也能正确读取TextBlock文本?
3个回答

3
似乎WPF仍未提供所有屏幕阅读器的全面支持。我在网上搜索,最初只发现了类似问题无人回答的情况:

WPF:如何使屏幕阅读器从文本框中读取文本

继续搜索后,我发现有一个阅读器似乎可以与WPF一起使用:NVDA。要了解更多信息,请查看NVDA社区页面。我从以下问题中找到了这个信息:

屏幕阅读器(NVDA)只读取WPF窗口标题

此外,似乎您需要设置x:Uid属性(通常为WPF UI自动化保留),以便读出字符串。我从以下问题中找到了这个信息:

如何使我的WPF应用程序与屏幕阅读器兼容?

最后,在Dev Pro网站的如何为辅助功能编写WPF应用程序中,您可以找到有关在WPF应用程序中提供辅助功能的有用教程。


嗨,谢丹,感谢您的回复。不幸的是,客户使用Jaws,因此更改所使用的屏幕阅读器不是一个选项。 我也尝试了在文本块上设置自动化属性,但未成功。我觉得这很不寻常,因为在应用程序的其他地方,我已经设置了自动化属性并正常运作。 我会继续努力解决它。 - coffeecoder

3

我通过在TextBlockRun上提供AutomationProperties.HelpText属性的值,并在窗口加载后将焦点集中在TextBlock上来解决了这个问题。


看起来不像是运行暴露了 HelpText 属性? https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.ui.xaml.documents.run - IronHide
'AutomationProperties.HelpText' 是一个附加属性。它不属于 Run 类。您可以通过在 xaml 中编写 AutomationProperties.HelpText="<your text here>" 来设置它;在代码后台中,您可以通过调用 AutomationProperties.SetHelpText(myRun, "your text here"); 来设置它。 - Tony Vitabile

2

将TextBlock的Focusable属性设置为true对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接