内で使用されるパネルを取得するにはどうすればよいTreeView
ですか? デフォルトではこれに a をTreeView
使用することを読みましVirtualizingStackPanel
た。テンプレートを見るTreeView
と、<ItemsPresenter /> しか表示されず、使用されているパネルの詳細が隠されているように見えます。
可能な解決策:
1) ツリービュー インスタンス (「tv」) で、コードから、tv.ItemsPanel を実行します。
問題は、これがパネルではなく、ItemsPanelTemplate (「項目のレイアウトを制御するパネルを定義するテンプレートを取得または設定する」) を返すことです。
2) <ItemsPresenter /> を独自の ItemsControl.ItemsPanel に明示的に置き換える TreeView テンプレートを作成します。とにかく特別なテンプレートを提供しているので、これは私のシナリオでは問題ありません。次に、そのテンプレート内に配置するパネルにパーツ名を付けます。コードからそのパーツ (つまり、パネル) を取得できます。これの問題?下記参照。
(以下に示すように、TreeView から派生した VirtualTreeView という名前のコントロールを使用しています):
<ControlTemplate x:Key="VirtualTreeViewTemplate" TargetType="{x:Type local:VirtualTreeView}">
<Border>
<local:VirtualScrollViewer
Style="{StaticResource VirtualScrollViewer}"
x:Name="PART_VirtualScrollViewer"
CanContentScroll="True">
<!-- instead of: <ItemsPresenter />, use following: -->
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel
Name="PART_ItemsStackPanel"
IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</local:VirtualScrollViewer>
</Border>
</ControlTemplate>
[見やすくするために、ここでは雑然としたものをすべて取り除きました...]
これに関する問題は次のとおりです。これにより、TreeView レイアウト メカニズムが即座にオーバーライドされます。実際には、TreeViewItems がツリーを埋めている場合でも、空白の画面が表示されます。さて、私がパネルを手に入れたい理由は、MeaureOverride に参加するためですが、そのすべてに立ち入ることなく、ツリービューのレイアウト方法の本を書き直したくはありません。つまり、これをステップ 2 の方法で行うと、最初に TreeView を使用することさえ無効になるようです。
ここに混乱がある場合は申し訳ありませんが、提供できるヘルプに感謝します。