2017-01-19 3 views
0

В моем приложении C# Winforms у меня есть несколько меток управления ярлыками (например: & Name). Мы используем программу чтения 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. Вы можете попытаться создать пользовательский ярлык, который, в свою очередь, предоставит настраиваемый объект ControlAccessibleObject, в котором вы переопределите свойство «Значение», чтобы сделать доступным текст без амперсанда. – TnTinMn

ответ

0

Как я уже говорил в моем предыдущем комментарии, это проблема доступности. Следующий пользовательский номер Label предоставляет новое свойство stringAccessibleValue, которое может быть установлено в тексте, который PropertyObject вернет в качестве значения.

Я не знаю, работает ли это с устройством чтения JAWS, но оно отображало пользовательское значение при использовании инструмента Inspect.

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 собственности.

Ex: String text = label1.AccessibleObject.Name;

Смежные вопросы