カスタムメッセージウィンドウを表示する必要があるWPFデスクトップアプリケーションがあります。私はFreedom ScientificのJAWSのようなスクリーンリーダーによって、それらを適切に声を出して読み上げるのが難しいです。Win32 MessageBoxの読み方と同様に、スクリーンリーダーにWPFメッセージを読み込ませるにはどうすればよいですか?
システムメッセージボックスを表示しているのと同じ動作をしたいと思います。比較のために、System.Windows.MessageBox.Show("my message", "My Caption);
は、"My caption dialog。My message。OK Button"とJAWSによって発表されています。これは完璧です。
私のメッセージウィンドウ(TextBlock
とOK Button
のみを含む)を開くと、ウィンドウのタイトルが表示され、[OK]ボタンがフォーカスされていると表示されますが、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ダイアログのアクセシビリティタイプが「ウィンドウ」であるということです。これは重要かもしれません。 UIオートメーションコントロールタイプのダイアログhttps://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspxはありません。これはおそらくWPFのバグか制限ですか?
私は、
AutomationPeer
がより良い情報を持つように、さまざまな 'AutomationProperties'添付プロパティを設定しようとしましたが、ShowDialog
が実行されたときに読み込まれるものはありません。TextBlock
は入力フォーカスを受け取ることができないため、タブで読み取ったテキストを取得する方法もありません。私は一時的にフォーカスを得るために読み取り専用のTextBox
を使用していますが、経験はまだ間違っています。私たちの目の不自由なユーザーは、単純なステータスメッセージを読むだけでタブを閉じる必要はありません。実験の一部として、メッセージウィンドウに対して私自身の派生形の
AutomationPeer
を作成しようとしましたが、ダイアログが起動されると自動的にCore
メソッドの内容は読み込まれません。自動化された子リストは、最初の子としてリストされたタイトルバーオブジェクトを持っていますが、それはシステムメッセージボックスの最後の子ですが、私はそれを今変更する方法は見当たりません。
私は、盲目のユーザにとって完全な適切なアクセシビリティを備えたWPFベースのカスタムメッセージボックスを作成するための助けに感謝します。
面白い!私はクラス名のためにそれを使用するとは考えていませんでした。これを試してみると、OSのメッセージボックスと同じように最初の項目は自動的には読み込まれません。それはあなたのためにそれらを読んでいますか?おそらく、私は自分のTextBlockに変更を加える必要があるかもしれません。 – jschroedl
私はNVDAで試してみましたが、そこで動作します。ダイアログxamlで何も変更する必要はありませんでした。 JAWSでテストし、私の所見を報告します。私は今とても忙しいので、これには数週間かかります。 – batzen
私はたくさん試しましたが、JAWSにダイアログの内容を読み込ませるために何をすべきかを知ることができませんでした。 JAWSの背後にある会社にダイアログの検出方法を尋ねるべきかもしれません。 JAWSをアンインストールすると、マシンが大幅に減速するためです。 – batzen