2015-06-26 47 views
2

我剛開始使用AutomationElement是因爲我們想對我們的自定義控件進行集成測試,而我認爲我應該使用AutomationElement。我應該使用AutomationPeer還是AutomationElement?或兩者?

我已經成功地創建一個窗口中有一個自定義的控制,並能成功獲得AutomationElements的窗口和控制

// Retrieve the View 
    System.Windows.Automation.Condition viewCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyTestView"); 
    AutomationElement view = AutomationElement.RootElement.FindFirst(TreeScope.Children, viewCondition); 
    Assert.IsNotNull(view); 

    // Retrieve the CustomControl 
    System.Windows.Automation.Condition comboboxCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyCustomControl"); 
    AutomationElement combobox = view.FindFirst(TreeScope.Children, comboboxCondition); 
    Assert.IsNotNull(comboboxCondition); 

現在,我想要做的是使用,例如ValuePattern兩者。這就是我變得困惑的地方。

尋找信息,我在referencesource.microsoft.com搜索了WPF源代碼。我遇到了ComboboxAutomationPeer,它實現了IValueProvider,所以現在我很困惑。

我應該實現MyCustomControlAutomationPeer實現IValueProvider,並且AutomationElement然後將使用ValuePattern嗎?或者我應該有MyCustomControl實現IValueProvider?

+1

一個的AutomationPeer存在於您要自動化的應用程序。就像這個WPF應用程序中的ComboBox一樣。 AutomationElement是您在代碼中使用的一種,它使用*自動化修補這樣的WPF應用程序。這個代碼。 –

+0

謝謝你解釋漢斯的區別。 – Diana

回答

1

您不必執行任何操作來使用模式。用戶界面自動化爲您執行此操作(充當目標應用程序的代理)。這是這裏的官方文檔中很好的解釋:Get Supported UI Automation Control Patterns

下面是一個例子摘錄:

SelectionItemPattern pattern; 
    try 
    { 
     pattern = yourAutomationElement.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern; 
    } 
    catch (InvalidOperationException ex) 
    { 
     Console.WriteLine(ex.Message); // Most likely "Pattern not supported." 
     return; 
    } 
    pattern.Select(); 
+0

好吧,我現在要更具體:假設我有一個由模板部分組成的自定義控件。你是說這個自定義控件會自動生成其部件的模式?即我不必在我的自定義控件中實現UI Automation的任何功能,因爲它會繼承文本框部分的模式? – Diana

+0

好吧,現在您正在使用AutomationPeers的服務器端(我的示例是客戶端)。對於服務器端*,通常*,您不必做任何事情,因爲WPF自動爲標準控件構建對等點。但是,如果你需要添加一些自定義行爲(例如,如果你有一個純粹的繪圖,但你想突出顯示某些部分),那麼你可以。但是你應該首先使用UIA sdk工具(inspect.exe等等)來檢查你的控件是否是開箱即用的。 –

+0

我沒有標準控件。我有一個模板部件的自定義控件。我的自定義控件是否繼承了模板部件的模式? – Diana

相關問題