方法 : UIHierarchy を使用してツリー ビューを操作する
Visual Studio アドインは、Visual Studio 2013 では使用されなくなりました。 アドインを VSPackage 拡張機能にアップグレードしてください。 アップグレードの詳細については、「FAQ: アドインを VSPackage 拡張に変換する」を参照してください。
ソリューション エクスプローラーなど、Visual Studio の一部のツール ウィンドウには、その内容を操作するために使用できる明示的なオートメーション オブジェクトがありません。 ただし、これらのツール ウィンドウには、ツリー ビュー (階層構造でアウトラインを示すノードのビュー) があります。このビューには、プログラムでアクセスできます。 UIHierarchy オブジェクトは、このようなツール ウィンドウのツリー ビューを表します。また、このオブジェクトにより、ツリー ビューを反復処理し、ノードの内容を表示できます。
オブジェクト名 |
説明 |
---|---|
UIHierarchy オブジェクト |
指定したツール ウィンドウにあるツリー ビューを表します。 |
UIHierarchyItems コレクション |
ツリー ビューにあるすべてのノードを表します。 |
UIHierarchyItem オブジェクト |
ツリー ビューにある単一のノードを表します。 |
これらのオブジェクトとコレクションを使用して、次の操作を行うことができます。
ツリー ビューで (1 つまたは多数の) ノードを選択して表示します。
ツリー ビュー内でカーソル位置を上下に移動します。
選択した項目の値を返すか、選択した項目の既定のアクションが実行されます。
ToolWindows オブジェクト (ToolWindows からも返される) を使用すると、Visual Studio のさまざまなツール ウィンドウを簡単に参照できます。 たとえば、現在は、_applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput) ではなく、_applicationObject.ToolWindows.OutputWindow を使用できます。
注意
実際に画面に表示されるダイアログ ボックスとメニュー コマンドは、アクティブな設定またはエディションによっては、ヘルプの説明と異なる場合があります。ここに記載されている手順は、全般的な開発設定が適用されているものとして記述されています。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio での開発設定のカスタマイズ」を参照してください。
使用例
UIHierarchy オブジェクトは、ソリューション エクスプローラーなど、ツリー ビューを持つほとんどのツール ウィンドウの内容を表しますが、ツール ウィンドウ自体は Window オブジェクトのままです。 UIHierarchyItems プロパティは、指定したツール ウィンドウのトップレベル ノードのコレクションを返します。 ソリューション エクスプローラーには、単一のトップレベル ノード (ソリューション) だけが表示されます。 その結果、この特定のウィンドウのプロジェクト ノードは、ウィンドウの UIHierarchyItems コレクションではなく、トップレベル ノードのコレクションに含まれます。
この点を考慮に入れると、ツリー ビュー内の特定のノード (UIHierarchyItem) にアクセスするには次の 2 つの方法が考えられます。
GetItem メソッドを使用し、ソリューション/プロジェクト/項目というパターンを使用して目的のノードを直接参照します。
UIHierarchyItems.Item.UIHierarchyItems... (コレクション/アイテム/コレクションというパターン) を使用します。
深い階層にあるノードに移動する場合は、このパターンを繰り返します。 たとえば、トップレベル ノードの下位にあるノードに移動するには、UIHierarchy.UIHierarchyItems.Item(1).UIHierarchyItems.Item(2) を使用します。
この 2 つの方法を使用して下位のノードにアクセスする方法の例を次に示します。
これらのアドインの例では、UIHierarchy オートメーション モデルのさまざまなメンバーを参照および使用し、ソリューション エクスプローラー内のすべての項目の一覧を表示する方法について説明します。
最初の例では、GetItem メソッドを使用して、ソリューション エクスプローラー内の [References] ノードの内容にアクセスします。 アドイン コードの実行方法の詳細については、「方法 : オートメーション オブジェクト モデルのコード例をコンパイルおよび実行する」を参照してください。
注意
ソリューション エクスプローラーの例では、メッセージ ボックスにデータを送信します。
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