2012-05-23 7 views
7

Chcę ustawić tekst na elemencie textfield/textbox z Mircosoft UI Automation ram, czyli na AutomationElement z ControlType.Edit lub ControlType.Document.zestaw tekst na textField/tekstowym z ramami automatyki i uzyskać zdarzenie zmienić

Obecnie używam TextPattern uzyskać tekst z jednego z tych AutomationElements:

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

Ale teraz chcę ustawić nowy tekst w AutomationElement. Nie mogę znaleźć metody w klasie TextPattern. Więc staram się używać ValuePattern ale nie jestem pewien, czy to dobry sposób, żeby to zrobić:

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

Czy istnieje inny sposób, aby ustawić wartość tekstową?

Innym pytaniem jest, w jaki sposób można uzyskać zdarzenie, gdy tekst został zmieniony na elemencie Edit/Document? Próbowałem użyć TextChangedEvent ale nie dostanę jakieś zdarzenia opalane przy zmianie tekst:

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"); 
} 

Odpowiedz

6

Można użyć ValuePatern, że jest to sposób, aby to zrobić. Z własnego kodu:

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

Można zarejestrować do Event używając:

var myEventHandler= 
      new AutomationEventHandler(handler); 

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

i metoda handler:

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

Istnieje również AutomationPropertyChangedEventHandler (wykorzystanie Automation.AddAutomationPropertyChangedEventHandler(...) w tym przypadku) to może być przydatne.

Na podstawie tego sample z MSDN.