Condividi tramite


Procedura: modificare le visualizzazioni struttura mediante UIHierarchy

Aggiornamento: novembre 2007

Alcune finestre degli strumenti di Visual Studio come Esplora macro ed Esplora soluzioni non dispongono di oggetti di automazione espliciti utilizzabili per modificare il contenuto. Queste finestre degli strumenti dispongono, tuttavia, di una visualizzazione struttura, ovvero di una visualizzazione dei nodi dalla struttura gerarchica alla quale è possibile accedere a livello di codice. L'oggetto UIHierarchy rappresenta le visualizzazioni struttura in queste finestre degli strumenti e consente di scorrerle e di visualizzare il contenuto dei relativi nodi.

Nome oggetto

Descrizione

Oggetto UIHierarchy

Rappresenta la visualizzazione struttura della finestra degli strumenti specificata.

Insieme UIHierarchyItems

Rappresenta tutti i nodi nella visualizzazione struttura.

Oggetto UIHierarchyItem

Rappresenta un singolo nodo nella visualizzazione struttura.

Questi oggetti e insiemi consentono di:

  • Selezionare (nodo per nodo o più nodi contemporaneamente) e visualizzare i nodi nella visualizzazione struttura.

  • Spostare il punto di inserimento verso l'alto o verso il basso nella visualizzazione struttura.

  • Restituire il valore dell'elemento selezionato o fare in modo che esegua l'azione predefinita.

In Visual Studio 2005, il nuovo oggetto ToolWindows (restituito anche dalla proprietà ToolWindows) consente di fare riferimento in modo semplificato alle diverse finestre degli strumenti di Visual Studio. Ad esempio, anziché utilizzare _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) è ora possibile utilizzare _applicationObject.ToolWindows.OutputWindow.

Nota:

Le finestre di dialogo e i comandi di menu visualizzati potrebbero non corrispondere a quelli descritti nella Guida in linea in quanto dipendono dall'edizione o dalle impostazioni attive. Queste routine sono state sviluppate con le Impostazioni generali per lo sviluppo attive. Per modificare le impostazioni, scegliere Importa/EsportaImpostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Esempio

Sebbene l'oggetto UIHierarchy rappresenti il contenuto di quasi tutte le finestre degli strumenti che dispongono di una visualizzazione struttura come Esplora soluzioni o Esplora macro, la finestra degli strumenti stessa è ancora un oggetto Window. La proprietà UIHierarchyItems restituisce l'insieme dei nodi di primo livello nella finestra degli strumenti specificata. In Esplora soluzioni esiste un solo nodo di primo livello che corrisponde alla soluzione. Anche in Esplora macro esiste un solo nodo di primo livello che corrisponde al nodo macro. Di conseguenza, i nodi del progetto per queste finestre specifiche si trovano nell'insieme del nodo di primo livello, non nell'insieme UIHierarchyItems della finestra.

Tenendo presente quanto sopra riportato, sono disponibili due modi per accedere a un nodo specifico (UIHierarchyItem) in una visualizzazione struttura:

  • Utilizzando il metodo GetItem per fare riferimento direttamente al nodo desiderato tramite un criterio soluzione/progetto/elemento.

  • Utilizzando UIHierarchyItems.Item.UIHierarchyItems..., un criterio insieme/elemento/insieme.

    Per passare all'interno della nidificazione dei nodi, continuare ad utilizzare questo criterio. Ad esempio, per accedere a un nodo subordinato del nodo di primo livello, è possibile utilizzare UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2).

Di seguito vengono riportati alcuni esempi di come utilizzare entrambe le tecniche per accedere a un nodo di livello inferiore.

In questi esempi relativi ai componenti aggiuntivi viene illustrato come fare riferimento ai diversi membri del modello di automazione UIHierarchy e come utilizzarli per elencare tutti gli elementi in Esplora soluzioni e tutte le macro nel nodo Esempi di Esplora macro.

Nel primo esempio viene utilizzata la strategia del metodo GetItem per accedere al contenuto del nodo Riferimenti in Esplora soluzioni. Nel secondo esempio viene illustrato come eseguire la stessa operazione per Esplora macro. Per ulteriori informazioni su come eseguire il codice del componente aggiuntivo, vedere Procedura: compilare ed eseguire gli esempi di codice del modello a oggetti di automazione.

Nota:

Negli esempi di codice riportati di seguito l'output viene indirizzato in modi diversi. Nell'esempio relativo a Esplora soluzioni i dati vengono inviati a una finestra di messaggio di Windows, mentre nell'esempio relativo a Esplora macro i dati vengono inviati alla finestra di output. Entrambe le modalità sono valide e non sono rilevanti ai fini dell'utilizzo dell'oggetto UIHierarchy.

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

In questo esempio viene utilizzato il criterio UIHierarchyItems.Item.UIHierarchyItems per accedere a un nodo in UIHierarchy. In questo esempio vengono elencate le macro contenute all'interno del secondo nodo UIHierarchy di Esplora macro. Si noti che anche in questo esempio viene chiamata la funzione GetOutputWindowPane dall'esempio precedente.

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

Nell'esempio di macro riportato di seguito viene illustrato come utilizzare l'oggetto UIHierarchy per elencare il contenuto della visualizzazione struttura della finestra Esplora soluzioni.

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

Vedere anche

Attività

Procedura: controllare Esplora soluzioni

Procedura: modificare le caratteristiche delle finestre

Concetti

Grafico del modello oggetto di automazione

Altre risorse

Creazione e controllo delle finestre di ambiente

Creazione di componenti aggiuntivi e di procedure guidate

Riferimenti su extensibility e automazione