Я хочу сделать свое приложение доступным (сделать мое приложение доступным для программ чтения с экрана, которые являются клиентом автоматизации пользовательского интерфейса, например "Narrator
").
У меня есть ContentControl
, что когда он получил фокус клавиатуры, я показываю всплывающую подсказку (беря ее из свойства Tooltip
этого ContentControl
).Это элемент управления, который используется многими способами, например, его можно использовать следующим образом: Content
этого ContentControl
является изображением значка вопросительного знака, а ToolTip
является текстом справки ...
Вот код концепции:
class AutoTooltipOnFocus : ContentControl
{
public AutoTooltipOnFocus()
{
this.GotKeyboardFocus += OnGotKeyboardFocus;
}
private void OnGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs keyboardFocusChangedEventArgs)
{
bool automationListens = AutomationPeer.ListenerExists(AutomationEvents.AutomationFocusChanged);
if (automationListens)
{
// don't show tooltip because GetNameCore of MyAutoPeer will represent the ToolTip value
return;
}
// show tooltip (by reading the ToolTip value of this AutoTooltipOnFocus)
}
protected override AutomationPeer OnCreateAutomationPeer()
{
return new MyAutoPeer(this);
}
}
class MyAutoPeer : FrameworkElementAutomationPeer
{
private AutoTooltipOnFocus _owner;
public MyAutoPeer(AutoTooltipOnFocus owner)
: base(owner)
{
}
protected override string GetNameCore()
{
return GetToolTipValueFromOwner();
}
private string GetToolTipValueFromOwner()
{
// just for the simplicity of the example, I return this:
return ToolTipService.GetToolTip(_owner).ToString();
}
}
Narrator
, например, считывает текстовое представление Content
(скажем, свойство AutomationProperties.Name
изображения установлено на «значок справки»"), а затем говорит" Подсказка: некоторый текст помощи ".
Я не хочу рассчитывать на подсказку, прочитанную всеми программами чтения с экрана (поправьте меня, если я ошибаюсь, думая, что некоторые из них нея прочитал подсказки), поэтому я заставил GetNameCore
возвращать содержимое ToolTip
, чтобы знать, что оно обязательно будет прочитано, и предотвратил появление подсказки (в обработчике OnGotKeyboardFocus
), чтобы предотвратить двойное чтениетот же текст справки.
Проблема в том, что: я подумал, что запрос AutomationPeer.ListenerExists(AutomationEvents.AutomationFocusChanged)
говорит мне, что автоматизация пользовательского интерфейса слушает мое приложение, но когда рассказчик не работает, этот метод возвращает «false», а в остальное время возвращаетtrue, поэтому подсказка не появляется, когда никто не использует программу чтения с экрана, поэтому мне нужно знать, каким образом можно указать, работает ли клиент автоматизации пользовательского интерфейса и прослушивает мое приложение.Может быть, есть обходной путь, добавив некоторый код в мой пользовательский AutomationPeer
.
Спасибо, что уделили время!