方法 : UIHierarchy を使用してツリー ビューを操作する
コンテンツを操作するために使用できるに 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