Изменить поведение программы чтения с экрана для текстового поля UWP?

#c# #xaml #uwp #controls

#c# #xaml #uwp #элементы управления

Вопрос:

Я написал пользовательский элемент управления, который работает аналогично паролю, но реализован с помощью текстового поля. Элемент управления заменяет символы по мере их ввода символом «точка» и используется в ситуациях, когда мы не хотим отображать фактическое содержимое. Он работает по желанию, за исключением того, что программа чтения с экрана будет считывать каждый введенный символ, что противоречит цели. Для сравнения, когда пользователь вводит символ в поле пароля, программа-диктор вместо введенного ключа скажет «скрытый».

Могу ли я что-нибудь сделать, чтобы изменить поведение программы чтения с экрана, когда пользователь вводит ключи в текстовое поле? Было бы здорово, если бы я мог указать «скрытый», но также было бы неплохо, чтобы программа чтения с экрана ничего не говорила. Я просмотрел свойства класса AutomationProperties, но не увидел ничего очевидного.

Ответ №1:

Когда вы пишете приложение для Windows, классы, которые вы используете для своего пользовательского интерфейса, уже предоставляют поддержку автоматизации пользовательского интерфейса, что позволяет использовать приложения для обеспечения доступности и вспомогательные технологии, такие как программы чтения с экрана. Автоматизация для PasswordBox — это PasswordBoxAutomationPeer, вы можете проверить одноранговую реализацию по умолчанию и переопределяет в части PasswordBoxAutomationPeer, она переопределяет метод IsPassword, который может помешать программе чтения с экрана считывать символы.

Таким образом, вы могли бы создать пользовательский класс из текстового поля и добавить поддержку автоматизации для дополнительных функций, которые вы включили в своем пользовательском классе. Затем переопределите OnCreateAutomationPeer, чтобы он возвращал ваш пользовательский одноранговый узел. Например:

 public class MyCustomAutomationPeer : FrameworkElementAutomationPeer
{
    public MyCustomAutomationPeer(MyTextBox owner) : base(owner)
    {
    }

    protected override string GetClassNameCore()
    {
        return "MyTextBox";
    }

    protected override bool IsPasswordCore()
    {
        return true;
    }

    protected override AutomationControlType GetAutomationControlTypeCore()
    {
        return AutomationControlType.Edit;
    }
}


public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        // other initialization; DefaultStyleKey etc.
    }

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

После этого вы можете заменить символы по мере их ввода символом «точка» в MyTextBox. Кроме того, для получения более подробной информации о пользовательских узлах автоматизации вы можете обратиться к этому документу.

Комментарии:

1. Спасибо, Файванг — это было именно то, что мне было нужно.