2017-01-19 1 views
0

내 C# Winforms 응용 프로그램에서는 단축키 설정이 거의 없습니다 (예 : & 이름). 우리는 JAWS 스크린 리더를 사용하고 있습니다. Label.Text는 항상 "& 이름"을 제공합니다. 바로 가기 키가없는 라벨 텍스트를 가져 오는 방법이 있습니까 ('&')? 실제로 '&'레이블이 거의 필요 없기 때문에 '&'을 String.empty로 바꿀 수 없습니다.C#에서 단축키 ('&')없이 레이블 텍스트 가져 오기

+0

그리고이 레이블에는 이중 &&가 있어야합니다. 힌트 : regexp. – Steve

+1

[가능한 문자열에서 액셀러레이터 문자를 제거 할 수 있습니까?] (http://stackoverflow.com/questions/3700612/how-can-i-remove-accelerator-characters-from-a-string) –

+0

이것은 가능한 복제입니다. 접근성 문제. 화면 판독기가 앰퍼샌드 문자를 읽고 있다는 설명을 기반으로 가정합니다. 독자가 제시하는 것은 자체 통제하에 있습니다. WinForms 컨트롤은 레거시 Accessibility.IAccessible 모델을 지원합니다. 앰퍼샌드없이 텍스트를 사용할 수 있도록 'Value' 속성을 재정 의하여 사용자 지정 ControlAccessibleObject를 제공하는 사용자 지정 레이블을 만들려고 할 수 있습니다. – TnTinMn

답변

0

의 시작을 형성 제거,이 접근성 문제입니다. 다음 사용자 정의 Label은 AccessibleObject가 값으로 반환 할 텍스트로 설정할 수있는 새로운 string 속성 AccessibleValue을 노출합니다.

JAWS 화면 판독기에서 작동하는지 여부는 알 수 없지만 검사 도구를 사용할 때 사용자 지정 값이 표시되었습니다.

public class AccessibleLabel : Label 
    { 
    protected override AccessibleObject CreateAccessibilityInstance() 
     { 
     return new LabelAccessibleObject(this); 
     } 

    public string AccessibleValue { get; set; } 

    private class LabelAccessibleObject : ControlAccessibleObject 
     { 
     private AccessibleLabel myowner; 
     public LabelAccessibleObject(AccessibleLabel owner) 
      : base(owner) 
      { 
      this.myowner = owner; 
      } 

     public override AccessibleRole Role 
      { 
      get 
       { 
       AccessibleRole accessibleRole = base.Owner.AccessibleRole; 
       if (accessibleRole != AccessibleRole.Default) 
        { 
        return accessibleRole; 
        } 
       return AccessibleRole.StaticText; 
       } 
      } 

     public override string Value 
      { 
      get 
       { 
       if (string.IsNullOrEmpty(myowner.AccessibleValue)) 
        { 
        return base.Value; 
        } 
       else 
        { 
        return myowner.AccessibleValue; 
        } 
       } 
      set 
       { 
       base.Value = value; 
       } 
      } 

     } 

    } 
0

쉬운 방법은 AccessibleObject.Name 재산을 사용하는 것입니다.

예 : String text = label1.AccessibleObject.Name;

관련 문제