Поделиться через


Практическое руководство. Управление представлениями в виде дерева с помощью объекта UIHierarchy

Некоторые окна инструментов в Visual Studio, например Обозреватель решений, не имеют заданные объекты автоматизации, которые можно использовать для управления их содержимое.Однако эти окна инструментов имеют представление в виде дерева, т.е. иерархическое, структурное представление узлов, доступ к которому можно получить программными средствами.Представления в виде дерева в этих окнах инструментов представлены объектом UIHierarchy, который позволяет выполнять перебор по представлениям и просматривать содержимое их узлов.

Имя объекта

Описание

Объект UIHierarchy

Обеспечивает представление в виде дерева в заданном окне инструментов.

Коллекция UIHierarchyItems

Обеспечивает все узлы в представлении в виде дерева.

Объект UIHierarchyItem

Обеспечивает один узел в представлении в виде дерева.

Использование этих объектов и коллекций дает возможность:

  • Выбирать один или несколько узлов и просматривать их в представлении в виде дерева.

  • Перемещать точку ввода вверх или вниз по представлению в виде дерева.

  • Возвращать значение выбранного элемента или заставлять его выполнять действие, заданное для него по умолчанию.

Объект ToolWindows (который также возвращается из ToolWindows) упрощает создание ссылок на различные окна инструментов в Visual Studio.Например, вместо _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) теперь можно использовать _applicationObject.ToolWindows.OutputWindow.

ПримечаниеПримечание

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих настроек или выпуска.Эти процедуры были разработаны с обычными параметрами разработки.Чтобы изменить настройки, в меню Сервис выберите команду Импорт и экспортпараметров.Дополнительные сведения см. в разделе Параметры Visual Studio.

Пример

Хотя объект UIHierarchy представляет содержимое практически любое окно инструментов, в котором находится представление в виде дерева, например Обозреватель решений, окно инструментов само по-прежнему объект Window.Свойство UIHierarchyItems возвращает коллекцию узлов верхнего уровня указанного окна инструментов.В обозревателе решений узлом верхнего уровня является только один узел — решение.Следовательно, узел проекта для данного окна в коллекции узлов верхнего уровня, а не коллекции окна UIHierarchyItems.

Исходя из этого, существует два способа получения доступа к определенному узлу (UIHierarchyItem) в представлении в виде дерева:

  • При помощи метода GetItem для создания прямой ссылки на необходимый узел с помощью шаблона “решение/проект/элемент”.

  • С помощью UIHierarchyItems.Item.UIHierarchyItems... (шаблон “коллекция/элемент/коллекция”).

    Для дальнейшего перехода по вложенным узлам используйте указанный шаблон.Например, чтобы перейти к узлу, подчиненному узлу верхнего уровня, следует использовать UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2).

Далее приведены примеры использования обоих методов для получения доступа к узлам нижнего уровня.

Эти примеры надстройки демонстрируют, как использовать различные члены модели автоматизации UIHierarchy, чтобы отобразить все элементы в Обозреватель решений.

В первом примере для доступа к содержимому узла “References” в обозревателе решений используется стратегия метода GetItem.Дополнительные сведения о запуске кода надстройки см. в разделе Практическое руководство. Компиляция и выполнение примеров кода модели объектов автоматизации.

ПримечаниеПримечание

Пример для Обозреватель решений отправляет свои данные в окно сообщения.

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

В следующем примере показано, как использовать 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

См. также

Задачи

Практическое руководство. Управление обозревателем решений

Практическое руководство. Изменение параметров окон

Основные понятия

Диаграмма модели объектов автоматизации

Другие ресурсы

Создание окон среды и управление ими

Создание надстроек и мастеров

Справочник по автоматизации и возможностям расширения среды