Выберите пользовательский элемент ComboBox с помощью автоматизации пользовательского интерфейса - PullRequest
0 голосов
/ 29 апреля 2019

Как выбрать элемент в настраиваемом поле со списком Microsoft UI Automation?У меня есть ComboBox, который выглядит следующим образом:

<ComboBox AutomationProperties.AutomationId="Rm8Function"
          ItemsSource="{Binding Source={StaticResource Functions}}"
          SelectedItem="{Binding Function, UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock
                Text="{Binding Mode=OneTime, Converter={StaticResource FunctionEnumConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Т.е. я переопределил ItemTemplate с помощью пользовательского DataTemplate.

Однако теперь я не могу выбрать элемент, используя ответ на выбор элемента списка со списком с помощью автоматизации пользовательского интерфейса :

public static void SelectComboBoxItem(this AutomationElement comboBox, string item)
{
    var expandCollapsePattern = comboBox.GetPattern<ExpandCollapsePattern>(ExpandCollapsePatternIdentifiers.Pattern);
    expandCollapsePattern.Expand();
    expandCollapsePattern.Collapse();
    var listItem = comboBox.FindFirst(TreeScope.Subtree,
        new PropertyCondition(AutomationElement.NameProperty, item));
    var selectionItemPattern = listItem.GetPattern<SelectionItemPattern>(SelectionItemPatternIdentifiers.Pattern);
    selectionItemPattern.Select();
}

public static T GetPattern<T>(this AutomationElement element, AutomationPattern pattern) where T: BasePattern
{
    try
    {
        return (T) element.GetCurrentPattern(pattern);
    }
    catch (InvalidOperationException)
    {
        element.PrintSupportedPatterns();
        throw;
    }
}

Выдает ошибку, сообщающую, что SelectionItemPatternIdentifiers.Pattern является неподдерживаемым шаблоном.Только SynchronizedInputPatternIdentifiers.Pattern поддерживается элементом, который он пытается выбрать в ComboBox.

Как мне написать свой DataTemplate, чтобы он стал доступным для выбора?

1 Ответ

0 голосов
/ 30 апреля 2019

Я переопределил мой ComboBox следующим образом:

<ComboBox AutomationProperties.AutomationId="Rm8Function"
          ItemsSource="{Binding Source={StaticResource Functions}}"
          SelectedItem="{Binding Function, UpdateSourceTrigger=PropertyChanged}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock
                AutomationProperties.Name="{Binding Mode=OneTime, Converter={StaticResource FunctionEnumConverter}}"
                Text="{Binding Mode=OneTime, Converter={StaticResource FunctionEnumConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Предоставление TextBlock того же значения AutomationProperties.Name, что и значение Text.

Я также обновил свою функцию, которая выбирает элемент ComboBox, следующим образом:

public static void SelectComboBoxItem(this AutomationElement comboBox, string item)
{
    var expandCollapsePattern = comboBox.GetPattern<ExpandCollapsePattern>(ExpandCollapsePatternIdentifiers.Pattern);
    expandCollapsePattern.Expand();
    expandCollapsePattern.Collapse();
    var listItem = comboBox.FindFirst(TreeScope.Subtree,
        new PropertyCondition(AutomationElement.NameProperty, item));
    var walker = TreeWalker.ControlViewWalker;
    var parent = walker.GetParent(listItem);
    while (parent != comboBox)
    {
        listItem = parent;
        parent = walker.GetParent(listItem);
    }
    var selectionItemPattern = listItem.GetPattern<SelectionItemPattern>(SelectionItemPatternIdentifiers.Pattern);
    selectionItemPattern.Select();
}

Очевидно, что при использовании ComboBox как есть, без переопределения ItemTemplate, вышеприведенная функция находит своего непосредственного потомка, который является ListBoxItem. Это ListBoxItem, который можно выбрать с помощью шаблона SelectionItemPattern. Но при переопределении ItemTemplate функция вместо этого находит TextBlock, который является дочерним по отношению к ListBoxItem. Поэтому мне пришлось изменить свою функцию таким образом, чтобы она перемещалась вверх, пока не нашла непосредственного потомка для ComboBox и не выбрала его.

...