Как можно получить панель, которая используется в TreeView
? Я читал, что по умолчанию TreeView
использует VirtualizingStackPanel
для этого. Когда я смотрю на шаблон TreeView
, все, что я вижу, это , который, кажется, скрывает детали того, какая панель используется.
Возможные решения:
1) На экземпляре дерева ("tv") из кода сделайте следующее: tv.ItemsPanel.
Проблема в том, что это возвращает не панель, а ItemsPanelTemplate («получает или задает шаблон, который определяет панель, управляющую макетом элементов»).
2) Создайте шаблон TreeView, который явно заменяет на ваш собственный ItemsControl.ItemsPanel. В любом случае, я предоставляю специальный шаблон, так что в моем сценарии это нормально. Затем присвойте имя детали панели, которую вы помещаете в этот шаблон, и из кода вы можете получить эту деталь (то есть панель). Проблема с этим? см. ниже.
(я использую элемент управления с именем VirtualTreeView, который получен из TreeView, как показано ниже):
<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.
Извините, если возникла путаница, спасибо за любую помощь, которую вы можете предложить.