SelectionItemPattern
支持SelectionItemPattern的控件有ListView、ListBox、RadioButton、GridView等。
1. SelectionItemPattern的三个重要方法:
1. AddToSelection:将当前元素添加到所选项的集合。
2. RemoveFromSelection: 从选定项的集合中移除当前元素。
3. Select: 取消所有已选中的项,然后选择当前元素。
2. SelectionItemPattern的Current属性
可通过Current属性的IsSelected属性来判断AutomationElement是否被selected.
如下代码演示了使用SelectionItemPattern来操作RadioButton控件。
1
using System;2
using System.Text;3
using System.Diagnostics;4
using System.Threading;5
using System.Windows.Automation;6

7
namespace UIATest8


{9
class Program10

{11
static void Main(string[] args)12

{13
Process process = Process.Start(@"F:\CSharpDotNet\AutomationTest\ATP\WpfApp\bin\Debug\WpfApp.exe");14
int processId = process.Id;15

16
AutomationElement element = FindElementById(processId, "radioButton1");17
SelectionItemPattern selectionItemPattern = GetSelectionItemPattern(element);18
selectionItemPattern.Select();19
}20

21

/**//// <summary>22
/// Get the automation elemention of current form.23
/// </summary>24
/// <param name="processId">Process Id</param>25
/// <returns>Target element</returns>26
public static AutomationElement FindWindowByProcessId(int processId)27

{28
AutomationElement targetWindow = null;29
int count = 0;30
try31

{32
Process p = Process.GetProcessById(processId);33
targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);34
return targetWindow;35
}36
catch (Exception ex)37

{38
count++;39
StringBuilder sb = new StringBuilder();40
string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();41
if (count > 5)42

{43
throw new InvalidProgramException(message, ex);44
}45
else46

{47
return FindWindowByProcessId(processId);48
}49
}50
}51

52

53

/**//// <summary>54
/// Get the automation element by automation Id.55
/// </summary>56
/// <param name="windowName">Window name</param>57
/// <param name="automationId">Control automation Id</param>58
/// <returns>Automatin element searched by automation Id</returns>59
public static AutomationElement FindElementById(int processId, string automationId)60

{61
AutomationElement aeForm = FindWindowByProcessId(processId);62
AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,63
new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));64
return tarFindElement;65
}66

67

SelectItemPattern#region SelectItemPattern68

69

/**//// <summary>70
/// Get SelectItemPattern71
/// </summary>72
/// <param name="element">AutomationElement instance</param>73
/// <returns>SelectItemPattern instance</returns>74
public static SelectionItemPattern GetSelectionItemPattern(AutomationElement element)75

{76
object currentPattern;77
if (!element.TryGetCurrentPattern(SelectionItemPattern.Pattern, out currentPattern))78

{79
throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the SelectionItemPattern.",80
element.Current.AutomationId, element.Current.Name));81
}82
return currentPattern as SelectionItemPattern;83
}84

85
#endregion86
}87
}88

以下代码为XAML:
1
<Window x:Class="WpfApp.Window1"2
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4
Title="Window1" Height="219" Width="353">5
<Grid>6
<RadioButton Height="16" HorizontalAlignment="Right" Margin="0,46,10,0" Name="radioButton1" VerticalAlignment="Top" Width="120">RadioButton</RadioButton>7
</Grid>8
</Window>9

本文简单介绍了SelectionItemPattern以及使用SelectionItemPattern来操作RadioButton。