Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make WPF App Accessible to screen reader

Tags:

I have a WPF application and part of the requirements are that it is accessible, including keyboard navigation and screen readers.

I have had some success with a a Treeview in the application by setting the AutomationProperties.Name in the ItemContainerStyle of the Treeview, but I am having problems with a Window that contains a text area and some buttons.

ZoomText will correctly read out the Title of the Window, but do so twice, as well as the text in the buttons, but I cannot get it to read the contents of the TextBlock.

The Text block is defined in a window as below. There are no binding errors showing up in the Visual Studio output while debugging, and the NVDA screen reader can read the content correctly, although this is not good enough for me as the customer uses 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> 

If anyone has had any success with WPF and Screen readers and has any insight, or can point me in the right direction it would be great.

Update:

It seems the problem is because the TextBlock is within another element. If the window has the TextBlock as it's only element the screen reader reads the text correctly. However I need the Dock and Stack Panels for layout, so I need to find a way to get the Screen reader to work when the TextBlock is not the only content in the window.

like image 904
coffeecoder Avatar asked Aug 06 '14 09:08

coffeecoder


People also ask

Can WPF be targeted to Web browser?

All replies. WPF only runs on windows. You can make a type of wpf application called xbap which runs in a browser.

How do I open a WPF file in my browser?

Open Windows Explorer, go to the folder that contains the compiled version of your WPF Browser application and double-click the application (the . xbap file). This will launch the application.

How do I open a WPF window in full screen?

Currently, the only way I know how to fullscreen my wpf application is: WindowStyle=None and WindowState=Maximized (and Topmost=True, though this is just needed to make sure it's above everything else).


1 Answers

You can do pretty much everything you need using the Automation Properties

For example;

  • Name
  • HelpText
  • Labels / LabeledBy

See documentation for more details on usage. Kind of surprised this wasn't answered by now considering the amount of upvotes. Either way, hope this helps. Cheers!

like image 122
Chris W. Avatar answered Oct 07 '22 22:10

Chris W.