如何获得在一个内使用的面板TreeView
?我读过默认情况下为此TreeView
使用 a VirtualizingStackPanel
。当我查看TreeView
模板时,我看到的只是 <ItemsPresenter />,它似乎隐藏了使用哪个面板的详细信息。
可能的解决方案:
1)在树视图实例(“tv”)上,从代码中执行以下操作:tv.ItemsPanel。
问题是,这不会返回一个面板,而是一个 ItemsPanelTemplate(“获取或设置定义控制项目布局的面板的模板”)。
2) 制作一个 TreeView 模板,用您自己的 ItemsControl.ItemsPanel 显式替换 <ItemsPresenter />。无论如何,我提供了一个特殊的模板,所以这在我的场景中很好。然后为您放置在该模板中的面板指定部件名称,并从代码中获取该部件(即面板)。这有什么问题吗?见下文。
(我使用的是从 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 的点无效。
抱歉,如果这里有一些混乱,感谢您提供的任何帮助。