Freigeben über


Suchen eines Benutzeroberflächenautomatisierungs-Elements anhand einer Eigenschaftenbedingung

HinweisHinweis

Diese Dokumentation ist für .NET Framework-Entwickler vorgesehen, die die verwalteten UI Automation-Klassen verwenden möchten, die im System.Windows.Automation-Namespace definiert sind.Aktuelle Informationen zu UI Automation finden Sie unter Windows Automation API: UI Automation.

In diesem Thema finden Sie Beispielcode, der das Suchen eines Elements in der UI Automation-Struktur auf Grundlage mindestens einer bestimmten Eigenschaft veranschaulicht.

Beispiel

Im folgenden Beispiel wird eine Reihe von Eigenschaftenbedingungen angegeben, die ein bestimmtes relevantes Element (bzw. bestimmte Elemente) in der AutomationElement-Struktur identifizieren. Anschließend wird mit der FindAll-Methode eine Suche nach allen übereinstimmenden Elementen ausgeführt. Diese Methode verwendet eine Reihe boolescher Operatoren aus AndCondition, um die Anzahl der übereinstimmenden Elemente einzuschränken.

HinweisHinweis

Bei einer Suche in RootElement sollte versucht werden, nur direkt untergeordnete Elemente zu erhalten.Eine Suche nach nachfolgenden Elementen kann hunderte oder sogar tausende Elemente durchlaufen und möglicherweise einen Stapelüberlauf verursachen.Wenn ein bestimmtes Element auf einer niedrigeren Ebene abgerufen werden soll, sollten Sie die Suche im Anwendungsfenster oder in einem Container auf niedrigerer Ebene starten.

        '''--------------------------------------------------------------------
        ''' <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 'FindTreeViewDescendants

///--------------------------------------------------------------------
/// <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);
    }
}

Siehe auch

Aufgaben

InvokePattern, ExpandCollapsePattern, and TogglePattern Sample

Verwenden der AutomationID-Eigenschaft

Konzepte

Abrufen von Benutzeroberflächenautomatisierungs-Elementen