Freigeben über


Gewusst wie: Verändern von Strukturansichten mithilfe von UIHierarchy

Einige Toolfenster in Visual Studio wie Makro-Explorer und Projektmappen-Explorer weisen explizit keine Automatisierungsobjekte zum Verändern des Fensterinhalts auf. Dafür bieten diese Toolfenster eine so genannte Strukturansicht, d. h., eine hierarchisch in Knoten gegliederte Ansicht, auf die der programmgesteuerte Zugriff möglich ist. Das UIHierarchy-Objekt stellt die Strukturansichten in diesen Toolfenstern dar und ermöglicht Ihnen, die Fenster zu durchlaufen und den jeweiligen Inhalt unter den einzelnen Knoten anzuzeigen.

Objektname

Beschreibung

UIHierarchy-Objekt

Stellt die Strukturansicht im angegebenen Toolfenster dar.

UIHierarchyItems-Auflistung

Stellt alle Knoten in der Strukturansicht dar.

UIHierarchyItem-Objekt

Repräsentiert einen einzelnen Knoten in der Strukturansicht.

Mithilfe dieser Objekte und Auflistungen können Sie folgende Aufgaben ausführen:

  • Einen einzelnen oder mehrere Knoten in der Strukturansicht auswählen und anzeigen.

  • Die Einfügemarke in der Strukturansicht nach oben oder unten verschieben.

  • Den Wert des ausgewählten Elements zurückgeben oder veranlassen, dass die jeweilige Standardaktion ausgeführt wird.

Mit Visual Studio 2005 wurde das neue ToolWindows-Objekt eingeführt (das auch von ToolWindows zurückgegeben wird), das ein einfacheres Erstellen von Verweisen auf die verschiedenen Toolfenster in Visual Studio erlaubt. Statt _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) können Sie nun _applicationObject.ToolWindows.OutputWindow verwenden.

Tipp

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Bei der Entwicklung dieser Verfahren war die Option Allgemeine Entwicklungseinstellungen aktiviert. Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.

Beispiel

Obwohl das UIHierarchy-Objekt den Inhalt nahezu aller Toolfenster mit einer Strukturansicht darstellt, z. B. Projektmappen-Explorer oder Makro-Explorer, handelt es sich dennoch nach wie vor um ein Window-Objekt. Die UIHierarchyItems-Eigenschaft gibt die Auflistung der Knoten auf oberster Ebene im angegebenen Toolfenster zurück. Im Projektmappen-Explorer gibt es nur einen einzelnen Knoten auf oberster Ebene, die Projektmappe. Im Makro-Explorer gibt es ebenfalls nur einen Knoten auf oberster Ebene, den Knoten Makros. Das bedeutet, dass sich Projektknoten für diese beiden Fenster in der Auflistung des Knotens der obersten Ebene und nicht in der UIHierarchyItems-Auflistung des Fensters befinden.

Daher gibt es zwei Möglichkeiten, in einer Strukturansicht auf einen bestimmten Knoten (UIHierarchyItem) zuzugreifen:

  • Durch Verwenden der GetItem-Methode zum direkten Verweisen auf den gewünschten Knoten mithilfe eines Musters in der Form Projektmappe/Projekt/Element.

  • Durch Verwenden von UIHierarchyItems.Item.UIHierarchyItems... (ein Muster in der Form Auflistung/Element/Auflistung)

    Wenn Sie zu einem tiefer geschachtelten Knoten navigieren möchten, setzen Sie dieses Muster einfach fort. Um z. B. zu einem Knoten zu wechseln, der dem Knoten der obersten Ebene untergeordnet ist, verwenden Sie UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2).

Die folgenden Beispiele veranschaulichen beide Verfahren für den Zugriff auf einen untergeordneten Knoten.

Diese Add-In-Beispiele veranschaulichen, wie die verschiedenen Member des UIHierarchy-Automatisierungsmodells zum Auflisten aller Elemente im Projektmappen-Explorer verwendet werden und wie auf sie verwiesen wird. Ebenso wird beschrieben, wie die Makros unter dem Knoten Samples im Makro-Explorer verwendet werden und wie auf sie verwiesen wird.

Im ersten Beispiel wird die Strategie der GetItem-Methode verwendet, um auf den Inhalt des Knotens Verweise im Projektmappen-Explorer zuzugreifen. Im zweiten Beispiel wird derselbe Vorgang für den Makro-Explorer veranschaulicht. Weitere Informationen zum Ausführen des Add-In-Codes finden Sie unter Gewusst wie: Kompilieren und Ausführen der Codebeispiele für das Automatisierungsobjektmodell.

Tipp

In den folgenden Codebeispielen erfolgt die Ausgabe auf jeweils unterschiedliche Art und Weise. Im Beispiel für den Projektmappen-Explorer werden die Daten an ein Windows-Meldungsfeld gesendet, im Beispiel für den Makro-Explorer hingegen an das Ausgabefenster. Beide Methoden können verwendet werden, ohne dass dies Auswirkungen auf die Verwendung von UIHierarchy hat.

Imports System.Text

Public Sub OnConnection(ByVal application As Object, ByVal  _
connectMode As ext_ConnectMode, ByVal addInInst As Object,  _
ByRef custom As Array) Implements IDTExtensibility2.OnConnection
    _applicationObject = CType(application, DTE2)
    _addInInstance = CType(addInInst, AddIn)
    listSlnExpNodes(_applicationObject)
End Sub

Sub listSlnExpNodes(dte as DTE2)
    ' Requires reference to System.Text for StringBuilder.
    Dim UIH As UIHierarchy = dte.ToolWindows.SolutionExplorer
    ' Set a reference to the first level nodes in Solution Explorer. 
    ' Automation collections are one-based.
    Dim UIHItem As UIHierarchyItem = _
      UIH.GetItem("MyAddin1\MyAddin1\References")
    Dim file As UIHierarchyItem
    Dim sb As New StringBuilder

    ' Iterate through first level nodes.
    For Each file In UIHItem.UIHierarchyItems
        sb.AppendLine(file.Name)
        ' Iterate through second level nodes (if they exist).
        Dim subitem As UIHierarchyItem
        For Each subitem In file.UIHierarchyItems
            sb.AppendLine("   " & subitem.Name)
        Next
    Next
    MsgBox(sb.ToString)
End Sub
using System.Text;

public void OnConnection(object application, ext_ConnectMode _
  connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    listSlnExpNodes(_applicationObject);
}

public void listSlnExpNodes(DTE2 dte)
{
    // Requires reference to System.Text for StringBuilder.
    UIHierarchy UIH = dte.ToolWindows.SolutionExplorer;
    // Set a reference to the first level nodes in Solution Explorer. 
    // Automation collections are one-based.
    UIHierarchyItem UIHItem = 
      UIH.GetItem("MyAddin1\\MyAddin1\\References");
    StringBuilder sb = new StringBuilder();

   // Iterate through first level nodes.
   foreach ( UIHierarchyItem file in UIHItem.UIHierarchyItems )
   {
       sb.AppendLine(file.Name);
       // Iterate through second level nodes (if they exist).
       foreach ( UIHierarchyItem subitem in file.UIHierarchyItems )
       {
           sb.AppendLine("   "+subitem.Name);
       }
   }
   MessageBox.Show(sb.ToString());
}
Public Sub OnConnection(ByVal application As Object, ByVal _
  connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef _
  custom As Array) Implements IDTExtensibility2.OnConnection
    _applicationObject = CType(application, DTE2)
    _addInInstance = CType(addInInst, AddIn)
    ListMacroSamples1(_applicationObject)
End Sub

Sub ListMacroSamples1(ByVal dte As DTE2)
    ' Reference the UIHierarchy, UIHierarchyItem, and OutputWindow 
    ' objects.
    Dim UIH As UIHierarchy = CType(dte.Windows.Item _
      (Constants.vsWindowKindMacroExplorer).Object, UIHierarchy)
    Dim samples As UIHierarchyItem = UIH.GetItem("Macros\Samples")
    Dim OWPane As OutputWindowPane = GetOutputWindowPane _
      ("List Macros", True)
    Dim file As UIHierarchyItem

    OWPane.Clear()
    For Each file In samples.UIHierarchyItems
        OWPane.OutputString(file.Name & _
        Microsoft.VisualBasic.Constants.vbCrLf)
        Dim macro As UIHierarchyItem
        For Each macro In file.UIHierarchyItems
            OWPane.OutputString("   " & macro.Name & _
            Microsoft.VisualBasic.Constants.vbCrLf)
        Next
    Next
End Sub

Function GetOutputWindowPane(ByVal Name As String, Optional ByVal _
  show As Boolean = True) As OutputWindowPane
    ' This is a support function for ListMacroSamples(). It provides 
    ' the Output window to list the contents of the Sample node.
    Dim win As Window = _applicationObject.Windows.Item _
      (EnvDTE.Constants.vsWindowKindOutput)
    If show Then win.Visible = True
    Dim OW As OutputWindow = _applicationObject. _
      ToolWindows.OutputWindow
    Dim OWPane As OutputWindowPane
    Try
        OWPane = OW.OutputWindowPanes.Item(Name)
    Catch e As System.Exception
        OWPane = OW.OutputWindowPanes.Add(Name)
    End Try
    OWPane.Activate()
    Return OWPane
End Function
public void OnConnection(object application, ext_ConnectMode 
  connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    ListMacroSamples1(_applicationObject);
}

public void ListMacroSamples1(DTE2 dte)
{
    // Reference the UIHierarchy, UIHierarchyItem, and OutputWindow 
    // objects.
    UIHierarchy UIH = (UIHierarchy) 
      dte.Windows.Item(Constants.vsWindowKindMacroExplorer).Object;
    UIHierarchyItem samples = UIH.GetItem("Macros\\Samples");
    OutputWindowPane OWPane = GetOutputWindowPane("List Macros", true);
        
    OWPane.Clear();
    foreach ( UIHierarchyItem fid in samples.UIHierarchyItems )
    {
        OWPane.OutputString(fid.Name+Environment.NewLine);
        foreach ( UIHierarchyItem macro in fid.UIHierarchyItems )
        {
            OWPane.OutputString("   " + macro.Name + 
              Environment.NewLine);
        }
    }
}

public OutputWindowPane GetOutputWindowPane(string Name, bool show)
{
    // This is a support function for ListMacroSamples(). It provides 
    // the Output window to list the contents of the Sample node.
    Window win = _applicationObject.Windows.Item
      (EnvDTE.Constants.vsWindowKindOutput);
    if (show) { win.Visible = true; }
    OutputWindow OW = _applicationObject.ToolWindows.OutputWindow;
    OutputWindowPane OWPane;
    try
    {
        OWPane = OW.OutputWindowPanes.Item(Name);
    }
    catch (System.Exception e)
    {
        OWPane = OW.OutputWindowPanes.Add(Name + 
          Environment.NewLine + e.Message);
    }
    OWPane.Activate();
    return OWPane;
}

Dieses Beispiel verwendet das UIHierarchyItems.Item.UIHierarchyItems-Muster, um auf einen Knoten in einer UIHierarchy zuzugreifen. In diesem Beispiel werden die im zweiten UIHierarchy-Knoten des Makro-Explorers enthaltenen Makros aufgelistet. Beachten Sie, dass in diesem Beispiel auch die Funktion GetOutputWindowPane vom oben stehenden Beispiel aufgerufen wird.

Public Sub OnConnection(ByVal application As Object, ByVal _
  connectMode As ext_ConnectMode, ByVal addInInst As Object, _
  ByRef custom As Array) Implements IDTExtensibility2.OnConnection
    _applicationObject = CType(application, DTE2)
    _addInInstance = CType(addInInst, AddIn)
    ListMacroSamples2(_applicationObject)
End Sub

Sub ListMacroSamples2(ByVal dte As DTE2)
    Dim uih As UIHierarchy = CType(dte.Windows.Item _
     (Constants.vsWindowKindMacroExplorer).Object, UIHierarchy)
    ' Set a reference to the second node in Macro Explorer. The 
    ' collections are one-based.
    Dim uihItem As UIHierarchyItem = _
    uih.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2)
    Dim file As UIHierarchyItem
    Dim owPane As OutputWindowPane = GetOutputWindowPane("List Macros")
    For Each file In uihItem.UIHierarchyItems
        owPane.OutputString(file.Name & _
        Microsoft.VisualBasic.Constants.vbCrLf)
        Dim macro As UIHierarchyItem
        For Each macro In file.UIHierarchyItems
            owPane.OutputString("   " & macro.Name & _
            Microsoft.VisualBasic.Constants.vbCrLf)
        Next
    Next
End Sub

Function GetOutputWindowPane(ByVal Name As String, Optional ByVal _
  show As Boolean = True) As OutputWindowPane
    ' This is a support function for ListMacroSamples(). It provides 
    ' the Output window to list the contents of the Sample node.
    Dim win As Window = _applicationObject.Windows.Item _
     (EnvDTE.Constants.vsWindowKindOutput)
    If show Then win.Visible = True
    Dim OW As OutputWindow = _
      _applicationObject.ToolWindows.OutputWindow
    Dim OWPane As OutputWindowPane
    Try
        OWPane = OW.OutputWindowPanes.Item(Name)
    Catch e As System.Exception
        OWPane = OW.OutputWindowPanes.Add(Name)
    End Try
    OWPane.Activate()
    Return OWPane
 End Function
public void OnConnection(object application, ext_ConnectMode 
  connectMode, object addInInst, ref Array custom)
{
    _applicationObject = (DTE2)application;
    _addInInstance = (AddIn)addInInst;
    ListMacroSamples2(_applicationObject);
}

public void ListMacroSamples2(DTE2 dte)
{
    UIHierarchy uih = (UIHierarchy) 
    dte.Windows.Item(Constants.vsWindowKindMacroExplorer).Object;
    // Set a reference to the second node in Macro Explorer. The 
    // collections are one-based.
    UIHierarchyItem uihItem = 
      uih.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2);
        
    OutputWindowPane owPane = GetOutputWindowPane("List Macros", true);
    foreach ( UIHierarchyItem fid in uihItem.UIHierarchyItems )
    {
         owPane.OutputString(fid.Name+Environment.NewLine);
         foreach ( UIHierarchyItem macro in fid.UIHierarchyItems )
         {
             owPane.OutputString("   " + macro.Name + 
               Environment.NewLine);
         }
    }
}

public OutputWindowPane GetOutputWindowPane(string Name, bool show)
{
    // This is a support function for ListMacroSamples(). It provides 
    // the Output window to list the contents of the Sample node.
    Window win = _applicationObject.Windows.Item
      (EnvDTE.Constants.vsWindowKindOutput);
    if (show) { win.Visible = true; }
    OutputWindow OW = _applicationObject.ToolWindows.OutputWindow;
    OutputWindowPane OWPane;
    try
    {
        OWPane = OW.OutputWindowPanes.Item(Name);
    }
    catch (System.Exception e)
    {
        OWPane = OW.OutputWindowPanes.Add(Name + Environment.NewLine + 
          e.Message);
    }
    OWPane.Activate();
    return OWPane;
}

Im folgenden Makrobeispiel wird veranschaulicht, wie UIHierarchy zum Auflisten des Inhalts der Strukturansicht des Fensters Projektmappen-Explorer verwendet wird.

Sub cvTreeView()
    Dim uih As UIHierarchy = DTE.ToolWindows.SolutionExplorer
    Dim uihItem As UIHierarchyItem
    Dim uihItems As UIHierarchyItems = uih.UIHierarchyItems
    Dim msg As String
    For Each uihItem In uihItems
        msg += uihItem.Name & vbCr
    Next
    MsgBox(msg)
End Sub

Siehe auch

Aufgaben

Gewusst wie: Steuern des Projektmappen-Explorers

Gewusst wie: Ändern des Erscheinungsbilds eines Fensters

Konzepte

Diagramm "Automationsobjektmodell"

Weitere Ressourcen

Erstellen und Steuern von Umgebungsfenstern

Erstellen von Add-Ins und Assistenten

Referenz zur Automatisierung und Erweiterbarkeit