2017-01-06 8 views
2

カスタムメッセージウィンドウを表示する必要がある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 inspectacceventツールを使用して見つけた何

  • システムメッセージボックスのアクセシビリティタイプは「ダイアログ」が、WPFダイアログのアクセシビリティタイプが「ウィンドウ」であるということです。これは重要かもしれません。 UIオートメーションコントロールタイプのダイアログhttps://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspxはありません。これはおそらくWPFのバグか制限ですか?

  • 私は、AutomationPeerがより良い情報を持つように、さまざまな 'AutomationProperties'添付プロパティを設定しようとしましたが、ShowDialogが実行されたときに読み込まれるものはありません。

  • TextBlockは入力フォーカスを受け取ることができないため、タブで読み取ったテキストを取得する方法もありません。私は一時的にフォーカスを得るために読み取り専用のTextBoxを使用していますが、経験はまだ間違っています。私たちの目の不自由なユーザーは、単純なステータスメッセージを読むだけでタブを閉じる必要はありません。

  • 実験の一部として、メッセージウィンドウに対して私自身の派生形のAutomationPeerを作成しようとしましたが、ダイアログが起動されると自動的にCoreメソッドの内容は読み込まれません。自動化された子リストは、最初の子としてリストされたタイトルバーオブジェクトを持っていますが、それはシステムメッセージボックスの最後の子ですが、私はそれを今変更する方法は見当たりません。

私は、盲目のユーザにとって完全な適切なアクセシビリティを備えたWPFベースのカスタムメッセージボックスを作成するための助けに感謝します。

答えて

3

あなたのウィンドウはMessageBoxであることをオートメーションAPIに伝える必要があります。 は、それは我々が我々のアプリ「DialogFeld」での局在を必要としないとしてドイツのローカライズされたコントロールタイプが

public class MessageBoxWindowAutomationPeer : WindowAutomationPeer 
{ 
    private const string WC_DIALOG = "#32770"; 

    public MessageBoxWindowAutomationPeer(Window owner) 
     : base(owner) 
    { 
    } 

    protected override string GetClassNameCore() 
    { 
     return WC_DIALOG; 
    } 

    protected override string GetLocalizedControlTypeCore() 
    { 
     return "Dialogfeld"; 
    } 

    protected override bool IsContentElementCore() 
    { 
     return true; 
    } 

    protected override bool IsControlElementCore() 
    { 
     return true; 
    } 
} 

であるあなたの窓

protected override AutomationPeer OnCreateAutomationPeer() 
{ 
    return new MessageBoxWindowAutomationPeer(this); 
} 

にこのコードを追加し、プロジェクトにこのクラスを追加行うには、 。それをローカライズすることは、自分で見つけなければならない部分です。 ;-)

+0

面白い!私はクラス名のためにそれを使用するとは考えていませんでした。これを試してみると、OSのメッセージボックスと同じように最初の項目は自動的には読み込まれません。それはあなたのためにそれらを読んでいますか?おそらく、私は自分のTextBlockに変更を加える必要があるかもしれません。 – jschroedl

+0

私はNVDAで試してみましたが、そこで動作します。ダイアログxamlで何も変更する必要はありませんでした。 JAWSでテストし、私の所見を報告します。私は今とても忙しいので、これには数週間かかります。 – batzen

+0

私はたくさん試しましたが、JAWSにダイアログの内容を読み込ませるために何をすべきかを知ることができませんでした。 JAWSの背後にある会社にダイアログの検出方法を尋ねるべきかもしれません。 JAWSをアンインストールすると、マシンが大幅に減速するためです。 – batzen

0

AutomationPropertiesを設定します。ですから、例えばTextBlockの

内部の実行時にヘルプテキスト:それは静的なテキストを読んでない傾向にあるような問題を中心に読んでから

<TextBlock> 
    <Run Text="aTextString" AutomationProperties.HelpText="ATextString"/> 
</TextBlock> 

または

<TextBlock> 
    <Run Text="aTextString" AutomationProperties.HelpText="{Binding Text, RelativeSource={RelativeSource self}}"/> 
</TextBlock> 
+0

私はこれを試して、もう一度やり直してみました。残念ながら、ダイアログが表示されているときはHelpTextのテキストは読み込まれません。どうしたらいいの?ウィンドウタイトルとフォーカスオブジェクトのテキスト(クローズボタン)だけを読み込みます。読者にこれがダイアログであり、フォーカスオブジェクトのテキストを読む前に読んでおかなければならない興味深いテキストがあることを、ウィンドウに設定する必要があるようです。 – jschroedl

0

OKは、ジョーズないWPFでありますラベルとTextBlocks - 奇妙な動作。

TextBoxを使用し、BorderStyle = Noneを設定し、その上に塗りつぶし=白、不透明度= 0.01の四角形を配置することがあります。これにより、ユーザーはTextBoxにフォーカスすることができず、テキストは静的ではなく、Jawsはテキストを自動的に読み取る必要があります。 。 。

+0

私は現在、あなたの説明に似たReadOnly TextBoxを使用しています。私はこれがWPFの制限だと考え始めています。WPFベースのウィンドウをスクリーンリーダーに 'ダイアログ'として識別させる方法はないようです。可能であれば、最初のラベルを探したり、アクセント可能性のイベントをトリガーしてテキストを読み込んだりします。だからこそ... – jschroedl

0

1つのことは、あなたのアプリケーションがポップアップするダイアログを読み取るジョーズでなければならないのでしょうか?

system.speech.synthesis.speechsynthesizerを使用して、ダイアログがポップアップするときにテキストを話すことを見たことがありますか?

+0

私たちの顧客はJawsを使用しているので、私たちのアプリケーションにはメッセージが読み込まれていないが、他の人にはなぜそうなっているのかを調査している。他のものはWin32アプリケーションで、私たちが問題だと思っているWPFではありません。 – jschroedl

関連する問題