Это примерно в 100 раз сложнее , чем нужно, но я наконец-то все заработало.Большая проблема с WPF ComboBox заключается в том, что с точки зрения автоматизации у него нет ListItems до тех пор, пока ComboBox не будет расширен .
В следующем коде используется шаблон ExpandCollapse.чтобы на мгновение раскрыть список и затем свернуть его, затем он может использовать FindFirst в ComboBox, чтобы получить ListItem, который будет выбран, и затем использовать шаблон SelectionItem, чтобы выбрать его.
В случае исходного вопросавыбор -1 означает, что элементы не выбраны.Для этого нет метода, но вы можете просто использовать FindAll, чтобы получить коллекцию ListItems, получить шаблон SelectionItem для каждого по очереди и вызвать его метод RemoveFromSelection.
public static void SetSelectedComboBoxItem(AutomationElement comboBox, string item)
{
AutomationPattern automationPatternFromElement = GetSpecifiedPattern(comboBox, "ExpandCollapsePatternIdentifiers.Pattern");
ExpandCollapsePattern expandCollapsePattern = comboBox.GetCurrentPattern(automationPatternFromElement) as ExpandCollapsePattern;
expandCollapsePattern.Expand();
expandCollapsePattern.Collapse();
AutomationElement listItem = comboBox.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.NameProperty, item));
automationPatternFromElement = GetSpecifiedPattern(listItem, "SelectionItemPatternIdentifiers.Pattern");
SelectionItemPattern selectionItemPattern = listItem.GetCurrentPattern(automationPatternFromElement) as SelectionItemPattern;
selectionItemPattern.Select();
}
private static AutomationPattern GetSpecifiedPattern(AutomationElement element, string patternName)
{
AutomationPattern[] supportedPattern = element.GetSupportedPatterns();
foreach (AutomationPattern pattern in supportedPattern)
{
if (pattern.ProgrammaticName == patternName)
return pattern;
}
return null;
}