Cómo: Manipular vistas de árbol mediante UIHierarchy
Actualización: noviembre 2007
Algunas ventanas de herramientas de Visual Studio, como el Explorador de macros y el Explorador de soluciones, no tienen objetos de automatización explícitos que se puedan utilizar para manipular su contenido. Sin embargo, estas ventanas de herramientas cuentan con una vista de árbol, es decir, una vista de nodos, jerárquica y de tipo esquemático, a la que se puede obtener acceso mediante programación. El objeto UIHierarchy representa las vistas de árbol de estas ventanas de herramientas y permite recorrerlas en iteración y ver el contenido de sus nodos.
Nombre de objeto |
Descripción |
---|---|
Objeto UIHierarchy |
Representa la vista de árbol en la ventana de herramientas especificada. |
Colección UIHierarchyItems |
Representa todos los nodos de la vista de árbol. |
Objeto UIHierarchyItem |
Representa un nodo de la vista de árbol. |
Mediante estos objetos y colecciones, se puede:
Seleccionar nodos (uno o varios) y verlos en la vista de árbol.
Mover el punto de inserción hacia arriba o hacia abajo en la vista de árbol.
Devolver el valor del elemento seleccionado o hacer que ejecute la acción predeterminada.
En Visual Studio 2005, el nuevo objeto ToolWindows (que también devuelve ToolWindows) facilita las referencias de las distintas ventanas de herramientas de Visual Studio. Por ejemplo, en lugar de utilizar _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput), ahora se puede utilizar _applicationObject.ToolWindows.OutputWindow.
Nota: |
---|
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Estos procedimientos se desarrollaron con la Configuración general de desarrollo activa. Para cambiar la configuración, elija la opción Importar y exportarconfiguraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio. |
Ejemplo
Aunque el objeto UIHierarchy representa el contenido de casi todas las ventanas de herramientas que tienen una vista de árbol, como el Explorador de soluciones o el Explorador de macros, la propia ventana de herramientas continúa siendo un objeto Window. La propiedad UIHierarchyItems devuelve la colección de nodos de nivel superior en la ventana de herramientas especificada. En el Explorador de soluciones sólo hay un nodo de nivel superior (la solución). En el Explorador de macros también hay sólo un nodo de nivel superior (el nodo Macros). Por consiguiente, los nodos de proyecto de estas ventanas en particular se encuentran en la colección del nodo de nivel superior en lugar de en la colección UIHierarchyItems de la ventana.
Teniendo en cuenta esto, hay dos maneras de obtener acceso a un nodo concreto (UIHierarchyItem) en una vista de árbol:
Mediante el método GetItem para hacer referencia directamente al nodo deseado mediante un modelo solución/proyecto/elemento.
Mediante UIHierarchyItems.Item.UIHierarchyItems... (modelo colección/elemento/colección).
Para adentrarse en el anidamiento de un nodo, bastará con utilizar este modelo. Por ejemplo, para ir a un nodo subordinado en el nodo de nivel superior, debería utilizar UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2).
A continuación, se muestran ejemplos sobre el modo de poner en práctica ambas técnicas para obtener acceso a un nodo de nivel inferior.
Estos ejemplos de complementos muestran cómo hacer referencia y utilizar los diversos miembros del modelo de automatización UIHierarchy para mostrar todos los elementos del Explorador de soluciones y todas las macros situadas debajo del nodo Samples del Explorador de macros.
El primer ejemplo utiliza la estrategia del método GetItem para tener acceso al contenido del nodo References del Explorador de soluciones. El segundo ejemplo muestra cómo hacer lo mismo en el Explorador de macros. Para obtener más información sobre cómo ejecutar el código de complemento, vea Cómo: Compilar y ejecutar los ejemplos de código del modelo de objetos de automatización.
Nota: |
---|
Los ejemplos de código siguientes canalizan el resultado de maneras diferentes. El ejemplo del Explorador de soluciones envía sus datos a un cuadro de mensaje de Windows, mientras que el ejemplo del Explorador de macros los envía a la ventana Resultados. Ambas maneras son válidas y no afectan el uso del objeto 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;
}
En este ejemplo se utiliza el modelo UIHierarchyItems.Item.UIHierarchyItems para obtener acceso a un nodo en un objeto UIHierarchy. Este ejemplo muestra las macros contenidas dentro del segundo nodo UIHierarchy del Explorador de macros. Observe que este ejemplo también invoca a la función, GetOutputWindowPane, desde el ejemplo anterior.
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;
}
El ejemplo de macro siguiente muestra cómo utilizar el objeto UIHierarchy para mostrar el contenido de la vista de árbol de la ventana Explorador de soluciones.
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
Vea también
Tareas
Cómo: Controlar el Explorador de soluciones
Cómo: Cambiar las características de las ventanas
Conceptos
Gráfico del modelo de objetos de automatización
Otros recursos
Crear y controlar las ventanas del entorno