#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. Спасибо, Файванг — это было именно то, что мне было нужно.