2012-05-23 14 views
7

Quiero configurar un texto en un elemento de campo de texto/cuadro de texto con la UI Automation marco Mircosoft , eso significa que en un AutomationElement del ControlType.Edit o ControlType.Document.conjunto de texto en el campo de texto/cuadro de texto con el marco de la automatización y obtener el evento de cambio

Por el momento estoy usando el TextPattern para obtener el texto de uno de estos AutomationElements:

TextPattern tp = (TextPattern)element.GetCurrentPattern(TextPattern.Pattern); 
string text = tp.DocumentRange.GetText(-1).Trim(); 

Pero ahora quiero fijar un nuevo texto en el AutomationElement. No puedo encontrar un método para esto en la clase TextPattern. Así que estoy tratando de utilizar el ValuePattern pero no estoy seguro de si esa es la forma correcta de hacerlo:

ValuePattern value = element.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern; 
value.SetValue(insertText); 

¿Hay alguna otra manera de establecer el valor de texto?

Otra pregunta es ¿cómo puedo obtener un evento cuando el texto fue cambiado en un elemento Edit/Document? He intentado utilizar el TextChangedEvent pero yo no recibo ningún evento despedido cuando se cambia el texto:

AutomationEventHandler ehTextChanged = new AutomationEventHandler(text_event); 
Automation.AddAutomationEventHandler(TextPattern.TextChangedEvent, element, TreeScope.Element, ehTextChanged); 

private void text_event(object sender, AutomationEventArgs e) 
{ 
    Console.WriteLine("Text changed"); 
} 

Respuesta

6

Puede utilizar el ValuePatern, que es la manera de hacerlo. Desde mi propio código:

ValuePattern etb = EditableTextBox.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern; 
etb.SetValue("test"); 

puede registrarse para Event usando:

var myEventHandler= 
      new AutomationEventHandler(handler); 

Automation.AddAutomationEventHandler(
    SelectionItemPattern.ElementSelectedEvent, // In your case you might want to use another pattern 
    targetApp, 
    TreeScope.Descendants, 
    myEventHandler); 

Y el handler método:

private void handler(object src, AutomationEventArgs e) {...} 

También hay un AutomationPropertyChangedEventHandler (uso Automation.AddAutomationPropertyChangedEventHandler(...) en este caso) eso puede ser útil.

Basado en este sample de MSDN.

Cuestiones relacionadas