Partilhar via


Localizar um elemento de automação da interface do usuário com base em uma condição de propriedade

Nota

Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de automação da interface do usuário gerenciadas definidas no System.Windows.Automation namespace. Para obter as informações mais recentes sobre a automação da interface do usuário, consulte API de automação do Windows: automação da interface do usuário.

Este artigo contém código de exemplo que mostra como localizar um elemento dentro da árvore de automação da interface do usuário com base em uma propriedade ou propriedades específicas.

Exemplo

No exemplo a seguir, é especificado um conjunto de condições de propriedade que identificam um determinado elemento (ou elementos) de interesse na AutomationElement árvore. Uma pesquisa para todos os elementos correspondentes é então realizada com o método que incorpora FindAll uma série de AndCondition operações booleanas para limitar o número de elementos correspondentes.

Nota

Ao pesquisar a RootElementpartir do , você deve tentar obter apenas crianças diretas. Uma busca por descendentes pode iterar através de centenas ou até milhares de elementos, possivelmente resultando em um estouro de pilha. Se você estiver tentando obter um elemento específico em um nível inferior, você deve iniciar sua pesquisa a partir da janela do aplicativo ou de um contêiner em um nível inferior.

///--------------------------------------------------------------------
/// <summary>
/// Walks the UI Automation tree of the target and reports the control
/// type of each element it finds in the control view to the client.
/// </summary>
/// <param name="targetTreeViewElement">
/// The root of the search on this iteration.
/// </param>
/// <param name="elementIndex">
/// The TreeView index for this iteration.
/// </param>
/// <remarks>
/// This is a recursive function that maps out the structure of the
/// subtree of the target beginning at the AutomationElement passed in
/// as the rootElement on the first call. This could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting
/// to map out the entire subtree of the desktop could take a very
/// long time and even lead to a stack overflow.
/// </remarks>
///--------------------------------------------------------------------
private void FindTreeViewDescendants(
    AutomationElement targetTreeViewElement, int treeviewIndex)
{
    if (targetTreeViewElement == null)
        return;

    AutomationElement elementNode =
        TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement);

    while (elementNode != null)
    {
        Label elementInfo = new Label();
        elementInfo.Margin = new Thickness(0);
        clientTreeViews[treeviewIndex].Children.Add(elementInfo);

        // Compile information about the control.
        elementInfoCompile = new StringBuilder();
        string controlName =
            (elementNode.Current.Name == "") ?
            "Unnamed control" : elementNode.Current.Name;
        string autoIdName =
            (elementNode.Current.AutomationId == "") ?
            "No AutomationID" : elementNode.Current.AutomationId;

        elementInfoCompile.Append(controlName)
            .Append(" (")
            .Append(elementNode.Current.ControlType.LocalizedControlType)
            .Append(" - ")
            .Append(autoIdName)
            .Append(")");

        // Test for the control patterns of interest for this sample.
        object objPattern;
        ExpandCollapsePattern expcolPattern;
        if (true == elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out objPattern))
        {
            expcolPattern = objPattern as ExpandCollapsePattern;
            if (expcolPattern.Current.ExpandCollapseState != ExpandCollapseState.LeafNode)
            {
                Button expcolButton = new Button();
                expcolButton.Margin = new Thickness(0, 0, 0, 5);
                expcolButton.Height = 20;
                expcolButton.Width = 100;
                expcolButton.Content = "ExpandCollapse";
                expcolButton.Tag = expcolPattern;
                expcolButton.Click +=
                    new RoutedEventHandler(ExpandCollapse_Click);
                clientTreeViews[treeviewIndex].Children.Add(expcolButton);
            }
        }
        TogglePattern togPattern;
        if (true == elementNode.TryGetCurrentPattern(TogglePattern.Pattern, out objPattern))
        {
            togPattern = objPattern as TogglePattern;
            Button togButton = new Button();
            togButton.Margin = new Thickness(0, 0, 0, 5);
            togButton.Height = 20;
            togButton.Width = 100;
            togButton.Content = "Toggle";
            togButton.Tag = togPattern;
            togButton.Click += new RoutedEventHandler(Toggle_Click);
            clientTreeViews[treeviewIndex].Children.Add(togButton);
        }
        InvokePattern invPattern;
        if (true == elementNode.TryGetCurrentPattern(InvokePattern.Pattern, out objPattern))
        {
            invPattern = objPattern as InvokePattern;
            Button invButton = new Button();
            invButton.Margin = new Thickness(0);
            invButton.Height = 20;
            invButton.Width = 100;
            invButton.Content = "Invoke";
            invButton.Tag = invPattern;
            invButton.Click += new RoutedEventHandler(Invoke_Click);
            clientTreeViews[treeviewIndex].Children.Add(invButton);
        }
        // Display compiled information about the control.
        elementInfo.Content = elementInfoCompile;
        Separator sep = new Separator();
        clientTreeViews[treeviewIndex].Children.Add(sep);

        // Iterate to next element.
        // elementNode - Current element.
        // treeviewIndex - Index of parent TreeView.
        FindTreeViewDescendants(elementNode, treeviewIndex);
        elementNode =
            TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
    }
}
'''--------------------------------------------------------------------
''' <summary>
''' Walks the UI Automation tree of the target and reports the control 
''' type of each element it finds in the control view to the client.
''' </summary>
''' <param name="targetTreeViewElement">
''' The root of the search on this iteration.
''' </param>
''' <param name="treeviewIndex">
''' The TreeView index for this iteration.
''' </param>
''' <remarks>
''' This is a recursive function that maps out the structure of the 
''' subtree beginning at the AutomationElement passed in as 
''' rootElement on the first call. This could be, for example,
''' an application window.
''' CAUTION: Do not pass in AutomationElement.RootElement. Attempting 
''' to map out the entire subtree of the desktop could take a very 
''' long time and even lead to a stack overflow.
''' </remarks>
'''--------------------------------------------------------------------
Private Sub FindTreeViewDescendants( _
ByVal targetTreeViewElement As AutomationElement, _
ByVal treeviewIndex As Integer)
    If (IsNothing(targetTreeViewElement)) Then
        Return
    End If

    Dim elementNode As AutomationElement = _
    TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement)

    While Not (elementNode Is Nothing)
        Dim elementInfo As New Label()
        elementInfo.Margin = New Thickness(0)
        clientTreeViews(treeviewIndex).Children.Add(elementInfo)

        ' Compile information about the control.
        elementInfoCompile = New StringBuilder()
        Dim controlName As String
        If (elementNode.Current.Name = "") Then
            controlName = "Unnamed control"
        Else
            controlName = elementNode.Current.Name
        End If
        Dim autoIdName As String
        If (elementNode.Current.AutomationId = "") Then
            autoIdName = "No AutomationID"
        Else
            autoIdName = elementNode.Current.AutomationId
        End If


        elementInfoCompile.Append(controlName).Append(" (") _
        .Append(elementNode.Current.ControlType.LocalizedControlType) _
        .Append(" - ").Append(autoIdName).Append(")")

        ' Test for the control patterns of interest for this sample.
        Dim objPattern As Object = Nothing
        Dim expcolPattern As ExpandCollapsePattern
        If True = elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, objPattern) Then
            expcolPattern = DirectCast(objPattern, ExpandCollapsePattern)
            If expcolPattern.Current.ExpandCollapseState <> ExpandCollapseState.LeafNode Then
                Dim expcolButton As New Button()
                expcolButton.Margin = New Thickness(0, 0, 0, 5)
                expcolButton.Height = 20
                expcolButton.Width = 100
                expcolButton.Content = "ExpandCollapse"
                expcolButton.Tag = expcolPattern
                AddHandler expcolButton.Click, AddressOf ExpandCollapse_Click
                clientTreeViews(treeviewIndex).Children.Add(expcolButton)
            End If
        End If
        Dim togPattern As TogglePattern
        If True = elementNode.TryGetCurrentPattern(TogglePattern.Pattern, objPattern) Then
            togPattern = DirectCast(objPattern, TogglePattern)
            Dim togButton As New Button()
            togButton.Margin = New Thickness(0, 0, 0, 5)
            togButton.Height = 20
            togButton.Width = 100
            togButton.Content = "Toggle"
            togButton.Tag = togPattern
            AddHandler togButton.Click, AddressOf Toggle_Click
            clientTreeViews(treeviewIndex).Children.Add(togButton)
        End If
        Dim invPattern As InvokePattern
        If True = elementNode.TryGetCurrentPattern(InvokePattern.Pattern, objPattern) Then
            invPattern = DirectCast(objPattern, InvokePattern)
            Dim invButton As New Button()
            invButton.Margin = New Thickness(0)
            invButton.Height = 20
            invButton.Width = 100
            invButton.Content = "Invoke"
            invButton.Tag = invPattern
            AddHandler invButton.Click, AddressOf Invoke_Click
            clientTreeViews(treeviewIndex).Children.Add(invButton)
        End If
        ' Display compiled information about the control.
        elementInfo.Content = elementInfoCompile
        Dim sep As New Separator()
        clientTreeViews(treeviewIndex).Children.Add(sep)

        ' Iterate to next element.
        ' elementNode - Current element.
        ' treeviewIndex - Index of parent TreeView.
        FindTreeViewDescendants(elementNode, treeviewIndex)
        elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode)
    End While

End Sub

Consulte também