2015-09-26 2 views
2

Я использую инструменты автоматизации Microsoft для добавления обработчиков изменений в текстовое поле. Код ниже:MS UI Automation- AddAutomationHandler не работает

  // Get a reference to the textbox. 
      var textbox = window.FindFirst(
       TreeScope.Descendants, 
       new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit) 
      ); 


     // Bind a property change handler to the textbox -- this works great 
     Automation.AddAutomationPropertyChangedEventHandler(
       textbox, 
       TreeScope.Element, 
       (o, e) => { Console.WriteLine("Textbox value property event"); }, 
       ValuePattern.ValueProperty 
      ); 

     //A different way of binding - why doesn't this fire? 
     Automation.AddAutomationEventHandler(
       TextPatternIdentifiers.TextChangedEvent, // is this the right event? 
       textbox, 
       TreeScope.Element, 
       (o, e) => { Console.WriteLine("Text Changed Event (I want this to fire please)"); } 
      ); 

Всякий раз, когда текстовое поле изменяется, добавленная Automation.AddAutomationEventHandler обработчик события добавил Automation.AddAutomationPropertyChangedEventHandler пожаров просто отлично, но обработчик события не срабатывает.

Должен ли я слушать здесь различные мероприятия? Какое это событие должно быть?

ответ

2

Вы проверили с помощью инструмента AccEvent SDK, что события TextChanged создаются пользовательским интерфейсом? Например, я просто запустил AccEvent и настроил его, чтобы сообщать о событиях TextChanged, которые поднимаются Notepad. На приведенном ниже изображении показано, что события поднимаются по мере ввода. Было бы интересно узнать, сообщает ли AccEvent о событиях по мере ввода пользовательского интерфейса, с которым вы работаете. Если события не поднимаются, ваш обработчик не будет вызван.

Спасибо,

Guy

enter image description here

+0

Инструмент AccEvent настолько полезен! Раньше я об этом не знал. Благодаря! Просто из любопытства - есть ли причина, по которой эти элементы управления не будут запускать определенные виды событий (например, почему кнопка не выдавала invokedEvent при нажатии?) – Jeff

+1

Добавление другого ответа для вставки изображения ... –

2

Инструмент AccEvent действительно очень полезно. У него наверняка есть место для улучшения с точки зрения удобства использования, но даже в этом случае он все равно поможет вам точно узнать, какие события МАУ возникают в пользовательском интерфейсе. И это включает в себя помощь в осознании того, какие события не возникают в пользовательском интерфейсе, когда вы ожидали, что события будут подняты. Как вы заметили, кнопка не может вызывать событие Invoked при его вызове, что неудобно для вас. К сожалению, я не думаю, что есть отличный ответ, почему некоторые события не поднимаются. В идеальном случае структура пользовательского интерфейса, используемая элементами управления пользовательского интерфейса, будет поднимать все соответствующие события. Например, я просто указал AccEvent на кнопку OK на Run dlg и вызвал кнопку. Снимок экрана ниже показал мне, что событие Invoked поднялось, когда я это сделал.

enter image description here

Держу пари, кто написал Run DLG явно не работают, чтобы поднять это событие, так что какая-то часть платформы делает это для DLG.

На боковой ноте полезно помнить, что часто при нажатии кнопки кнопка сразу уходит (как и в случае кнопки OK в Run dlg). Поэтому, если вы получаете событие Invoked и затем пытаетесь вернуться к элементу, который поднял это событие, чтобы получить более подробную информацию об элементе, это произойдет, если элемент больше не существует. Здесь может быть полезно запросить, чтобы данные о элементе были кэшированы с событием во время поднятия события.

Аналогично, если я укажу AccEvent на кнопку в приложении XAML, событие Invoked будет поднято, когда я нажму кнопку, как показано ниже.

enter image description here

Но если структура пользовательского интерфейса (или некоторые пользовательские UI, который выглядит как кнопка,) не вызывает событие вызывается при вызове кнопки, нет ничего, что вы будете в состоянии сделать, чтобы получить событие поднялось. МСА просто передает данные и события из пользовательского интерфейса на ваш клиентский код, и пользовательский интерфейс просто не может поднять события. В этом случае я считаю, что может быть интересно взглянуть на то, какие события возникают в конкретном сценарии, который мне интересен. Хотя событие, которое я действительно хочу, может не быть поднято, возможно, есть другие события, которые я мог бы реагировать чтобы достичь моих целей.

Спасибо,

Guy

0

длявашеговопроса:
я обнаружил, что, когда element.GetRuntimeId() длина 0, не стреляя, поэтому AddAutomationEventHandler не работают для этого element.
Надеюсь, я помог вам

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