Подтвердить что ты не робот

Сделать приложение WPF доступным для чтения с экрана

У меня есть приложение WPF, и часть требований заключается в том, что он доступен, включая клавиатуру и считыватели экрана.

У меня был некоторый успех с Treeview в приложении, установив AutomationProperties.Name в ItemContainerStyle Treeview, но у меня возникают проблемы с окном, которое содержит текстовую область и некоторые кнопки.

ZoomText будет правильно считывать заголовок окна, но делать это дважды, а также текст в кнопках, но я не могу заставить его прочитать содержимое TextBlock.

Текстовый блок определяется в окне, как показано ниже. На выходе Visual Studio во время отладки нет ошибок привязки, и читатель экрана 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 и Screen Reader и имеет какое-либо представление, или может указать мне в правильном направлении, это было бы здорово.

Update:

Кажется, проблема состоит в том, что TextBlock находится внутри другого элемента. Если в окне есть TextBlock, так как это единственный элемент, программа чтения с экрана считывает текст правильно. Однако мне нужна панель Dock и Stack Panels для компоновки, поэтому мне нужно найти способ заставить Screen Reader работать, когда TextBlock не является единственным содержимым в окне.

4b9b3361

Ответ 1

Вы можете сделать практически все, что вам нужно, используя Свойства автоматизации

Например:

Более подробную информацию об использовании см. в документации. Вид удивления, на который сейчас не ответили, учитывая количество оборотов. В любом случае, надеюсь, что это поможет. Ура!