2014-04-01 34 views
1

給出2個應用程序運行時:組XAML屬性在從其他C#申請(AutomationProperties.AutomationId)

  • 1 WPF應用,其中並非所有控件具有的AutomationID,並且我不能改變。另外,應用程序在運行時添加控件,而不設置AutomationId。它能夠自動上述WPF應用程序
  • 1控制檯應用程序

我需要的,因爲我想幾乎相同的時間內訪問的所有元素。 (在使用之前搜索自動化元素似乎在時間上有很大差異(取決於元素數量和樹層數)

我想設置AutomationID的WPF控件WPFs運行時期間的控制檯應用程序。如果你能想到解決這個問題的任何解決方案,我們將非常高興知道!


我曾嘗試至今:

1)的思考

Type type = element.GetType(); 
FieldInfo fi = type.GetField("AutomationIdProperty"); 
fi.SetValue(element, "x"); //Error 

錯誤消息:「類型 'System.String' 的對象不能被轉換爲類型「System.Windows .Automation.AutomationProperty'「但我想交出一個值,而不是屬性類型...

如果我使用下列代替,它不會引發錯誤,但在XAML中不會發生任何變化

fi.SetValue(element, AutomationElement.AutomationIdProperty); 

2)直接

AutomationElement element; // = my AutomationElement 
element.Current.AutomationId = "x"; //since AutomationId is Readonly - its not possible 

3)DependencyObjectsDependencyProperties似乎也很有希望,但我不能想出一個解決方案爲止。 有人有經驗嗎?

+0

可能的重複[有沒有方法來設置一個對象的AutomationID不使用XAML?](http://stackoverflow.com/questions/14617061/is-there-a-way-to-set-the- automationid-of-an-object-without-using-xaml) – cremor

+0

不這麼認爲。 1。他的問題是關於winForms,如果他將切換到XAML應用程序將被解決 2.他假設,是在同一個應用程序中,在比較,我想從其他應用程序設置AutomationIds(我希望這出來在我最初的帖子中)。 在同一個應用程序中,使用XAML會很容易: myUIControl.SetValue(AutomationProperties.AutomationIdProperty,「newID」); – Hansa

回答

1

IDK它是如何可能的,但WPF Inspector是完全能夠做什麼,我一直在尋找(現在我需要知道他們是如何連接到WPF應用程序:))。

____OLD ANSWER____ 似乎無法更改其他程序的XAML。如果開發人員「太懶」來設置AutomationId,我想出了一個替代解決方案。

自動化應用程序在開始時迭代所有控件,爲它們提供存儲在字典中的唯一名稱及其引用。如果組件在層次結構中被添加/刪除/更改,組件及其後代將在字典中被刪除,並且應用程序會重新遍歷該子樹。