У нас есть настольное приложение WPF, которое должно отображать некоторые пользовательские окна сообщений. У меня возникают проблемы с тем, чтобы их читать вслух должным образом читателями экрана, такими как JAWS от Freedom Scientific.Как заставить читатели экрана читать мое сообщение WPF так же, как они читают Win32 MessageBox?
Я хочу добиться такого же поведения, как при отображении системного сообщения. Для сравнения, System.Windows.MessageBox.Show("my message", "My Caption);
анонсируется JAWS как «Диалоговое окно« Моя подпись ».« OK »«. Это потрясающе.
Когда мои окна сообщений открываются (содержит только TextBlock
и ОК 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
и accevent
инструментов является то, что
Система сообщений коробчатого типа доступность «Диалог», но тип доступности для диалога WPF является «Window». Это может иметь значение. Нет типа интерфейса управления автоматизацией UI https://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspx. Возможно, это ошибка или ограничение в WPF?
Я попытался установить в моем окне дополнительные свойства «AutomationProperties», чтобы
AutomationPeer
получил лучшую информацию, но ни один из них не читается при запускеShowDialog
.Поскольку
TextBlock
не может получать фокус ввода, нет возможности даже получить текст, читаемый путем табуляции. Я временно использую только для чтенияTextBox
, чтобы получить фокус, но опыт по-прежнему не так, и наши слепые пользователи не должны заходить на сайт только для того, чтобы им было прочитано простое сообщение о состоянии.В качестве части эксперимента я также попытался создать собственное производное
AutomationPeer
для окна сообщений, но ни один из содержимого методаCore
не будет автоматически прочитан при запуске диалога. В дочернем списке автоматизации есть объект строки заголовка, указанный в качестве первого дочернего элемента, тогда как это последний дочерний элемент для окна системного сообщения, хотя я не вижу способа изменить это прямо сейчас.
Я бы очень признателен за любую помощь в создании окна для проверки подлинности на основе WPF с полной доступностью для слепых пользователей.
Интересно! Я не думал использовать это для имени класса. Пытаясь это сделать, он автоматически не считывает первый элемент, как в случае с сообщениями с сообщениями ОС. Он читает их для вас? Возможно, мне тоже нужно изменить мой TextBlock. – jschroedl
Я только пробовал его с NVDA, и там он работает, не нужно ничего менять в вашем диалоговом окне xaml. Будет проверять его с помощью JAWS и сообщать о моих выводах. Это займет несколько недель, так как я сейчас очень занят. – batzen
Я много пробовал, но мне не удалось выяснить, что нужно сделать, чтобы заставить JAWS прочитать содержимое диалогового окна. Возможно, вы должны спросить компанию за JAWS, как они обнаруживают диалоги. Мне пришлось удалить JAWS, потому что он вызывает значительное замедление на моей машине. – batzen