2017-01-06 11 views
2

우리는 몇 가지 사용자 지정 메시지 창을 표시해야하는 WPF 데스크톱 응용 프로그램이 있습니다. 프리덤 사이언 티픽 (Freedom Scientific)의 JAWS와 같은 스크린 리더가 적절하게 소리내어 읽도록하는 데 어려움을 겪고 있습니다.어떻게 화면 판독기가 Win32 MessageBox를 읽는 것과 비슷한 방법으로 내 WPF 메시지를 읽게합니까?

시스템 메시지 상자를 표시 할 때와 동일한 동작을 원합니다. 비교를 위해 System.Windows.MessageBox.Show("my message", "My Caption);은 JAWS에 의해 "내 캡션 대화 상자, 내 메시지. 확인 버튼"으로 발표되었습니다. 이것은 완벽 해.

내 메시지 창이 열리면 (및 OK 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의 수행을 읽는 아니에요. I는 Windows SDK inspectaccevent 도구를 사용하여 발견 한 무엇

  • 시스템 메시지 상자 접근성 유형이 '대화'하지만 WPF 대화의 접근 유형이 '창'는 것입니다. 이것은 중요 할 수 있습니다. UI 자동화 제어 유형 인 대화 상자 https://msdn.microsoft.com/en-us/library/ms749005(v=vs.110).aspx이 없습니다. 이것은 WPF의 버그 또는 제한입니까?

  • AutomationPeer이 더 나은 정보를 갖지만 ShowDialog이 실행될 때 그 중 아무 것도 읽히지 않도록 다양한 'AutomationProperties'연결된 속성을 내 창에서 설정해 보았습니다.

  • TextBlock은 입력 포커스를받을 수 없기 때문에 탭으로 읽은 텍스트를 가져 오는 방법조차 없습니다. 일시적으로 초점을 맞추기 위해 읽기 전용 TextBox을 사용하지만 경험은 여전히 ​​틀리며 시각 장애인은 간단한 상태 메시지를 읽도록 주위를 둘러 보지 않아도됩니다.

  • 실험의 일부로 메시지 창에 대해 자체적으로 파생 된 AutomationPeer을 만들려고했지만 대화 상자가 시작될 때 Core 메서드 내용이 자동으로 읽히지 않습니다. 자동화 하위 목록에는 첫 번째 자식으로 나열된 제목 표시 줄 개체가 있지만 시스템 메시지 상자의 마지막 자식은 현재 변경할 수있는 방법이 없습니다.

시각 장애인을위한 적절한 접근성을 갖춘 WPF 기반 custommessage 상자를 만드는 데 많은 도움을 주시면 감사하겠습니다.

답변

3

자동화 API에 Window가 MessageBox라는 사실을 알려줘야합니다. 는 우리가 우리의 응용 프로그램 "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에서 테스트하고 내 결과를보고합니다. 내가 지금 매우 바쁜 것에 따라 이것은 2,3 주 걸릴 것이다. – batzen

+0

많은 노력을했지만 JAWS가 대화 내용을 읽는 데 필요한 것을 알아낼 수 없었습니다. 아마 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

확인, 죠스하지 WPF 함께 레이블 및 TextBlocks - 이상한 행동.

해결 방법은 TextBox를 사용하고 BorderStyle = None을 설정하고 그 위에 fill = White, Opacity = 0.01로 사각형을 배치하는 것입니다. 이렇게하면 사용자가 TextBox에 집중할 수 없으므로 텍스트가 정적이 아니며 Jaws가 텍스트를 자동으로 읽어야합니다. . .

+0

현재 내가 설명하는 것과 비슷한 ReadOnly TextBox를 사용하고 있습니다. WPF 기반 윈도우를 독자를 스크린하는 '대화 상자'로 식별하는 방법이없는 것 같아 WPF 제한이라고 생각하기 시작했습니다. 만약 내가 할 수 있다면, 나는 그것이 초기 레이블을 찾는다 고 생각한다. 또는 아마 그것은 텍스트를 읽도록하는 accessibility 이벤트를 유발할 것이다. 너무 실망 스럽습니다. – jschroedl

0

한 가지, 앱이 튀어 나오는 대화 상자를 읽는 조우가 있어야합니까?

system.speech.synthesis.speechsynthesizer를 사용하여 대화 상자가 튀어 나오면 텍스트를 보면서 보았습니까?

+0

우리 고객은 Jaws를 사용합니다. 그래서 우리의 응용 프로그램에 읽은 메시지가없는 이유를 조사하고 있습니다. 다른 것들은 우리가 생각하기에 WPF가 아니라 Win32 앱입니다. – jschroedl