Практическое руководство. Управление представлениями в виде дерева с помощью объекта UIHierarchy
Некоторые окна инструментов в Visual Studio, такие как Обозреватель макросов и Обозреватель решений не имеют явных объектов автоматизации, с помощью которых можно управлять их содержимым. Однако эти окна инструментов имеют представление в виде дерева, т.е. иерархическое, структурное представление узлов, доступ к которому можно получить программными средствами. Представления в виде дерева в этих окнах инструментов представлены объектом UIHierarchy, который позволяет выполнять перебор по представлениям и просматривать содержимое их узлов.
Имя объекта |
Описание |
---|---|
Объект UIHierarchy |
Обеспечивает представление в виде дерева в заданном окне инструментов. |
Коллекция UIHierarchyItems |
Обеспечивает все узлы в представлении в виде дерева. |
Объект UIHierarchyItem |
Обеспечивает один узел в представлении в виде дерева. |
Использование этих объектов и коллекций дает возможность:
Выбирать один или несколько узлов и просматривать их в представлении в виде дерева.
Перемещать точку ввода вверх или вниз по представлению в виде дерева.
Возвращать значение выбранного элемента или заставлять его выполнять действие, заданное для него по умолчанию.
В Visual Studio 2005 появился новый объект ToolWindows (также возвращаемый из свойства ToolWindows), который упрощает создание ссылок на различные окна инструментов в Visual Studio. Например, вместо _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) теперь можно использовать _applicationObject.ToolWindows.OutputWindow.
Примечание
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспортпараметров.Дополнительные сведения см. в разделе Работа с параметрами.
Пример
Хотя объект UIHierarchy представляет содержимое практически любого окна инструментов, для которого доступно представление в виде дерева (например, Обозреватель решений или Обозреватель макросов), само окно инструментов по прежнему является объектом Window. Свойство UIHierarchyItems возвращает коллекцию узлов верхнего уровня указанного окна инструментов. В обозревателе решений узлом верхнего уровня является только один узел — решение. В обозревателе макросов узлом верхнего уровня является только один узел — макрос. Следовательно, узлы проекта для определенных окон находятся в коллекции узлов верхнего уровня, а не коллекции окна UIHierarchyItems.
Исходя из этого, существует два способа получения доступа к определенному узлу (UIHierarchyItem) в представлении в виде дерева:
При помощи метода GetItem для создания прямой ссылки на необходимый узел с помощью шаблона “решение/проект/элемент”.
С помощью UIHierarchyItems.Item.UIHierarchyItems... (шаблон “коллекция/элемент/коллекция”).
Для дальнейшего перехода по вложенным узлам используйте указанный шаблон. Например, чтобы перейти к узлу, подчиненному узлу верхнего уровня, следует использовать UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2).
Далее приведены примеры использования обоих методов для получения доступа к узлам нижнего уровня.
В следующих примерах надстроек показано, как обращаться к различным членам модели автоматизации UIHierarchy и использовать их для получения списка всех элементов в обозревателе решений, а также списка всех макросов под узлом Образцы в обозревателе макросов.
В первом примере для доступа к содержимому узла “References” в обозревателе решений используется стратегия метода GetItem. Во втором примере демонстрируется, как сделать то же самое для обозревателя макросов. Дополнительные сведения о запуске кода надстройки см. в разделе Практическое руководство. Компиляция и выполнение примеров кода модели объектов автоматизации.
Примечание
Следующие примеры кода выводят свои результаты различными способами.В примере с обозревателем решений данные отправляются в окно сообщения Windows, а в примере с обозревателем макросов — в Окно вывода.Допускается любой способ и это не влияет на использование 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;
}
В этом примере для доступа к узлу в UIHierarchy используется шаблон UIHierarchyItems.Item.UIHierarchyItems. Пример выводит список макросов из второго узла UIHierarchy обозревателя макросов. Обратите внимание, что этот пример также вызывает функцию GetOutputWindowPane из предыдущего примера.
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;
}
В следующем примере макроса показано, как использовать UIHierarchy для вывода содержимого представления в виде дерева для окна Обозреватель решений.
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
См. также
Задачи
Практическое руководство. Управление обозревателем решений
Практическое руководство. Изменение параметров окон
Основные понятия
Диаграмма модели объектов автоматизации