WPF树视图中的ContentControl

WPF树视图中的ContentControl,wpf,Wpf,我试图在一个树状视图中添加一个内容控件,但当我在内容控件中添加树状视图项时,它们会与其他树状视图项对齐得更远 <TreeView> <TreeViewItem Header="XXX-1"></TreeViewItem> <TreeViewItem Header="XXX-2"></TreeViewItem> <ContentControl> <TreeViewItem Head

我试图在一个树状视图中添加一个内容控件,但当我在内容控件中添加树状视图项时,它们会与其他树状视图项对齐得更远

<TreeView>
    <TreeViewItem Header="XXX-1"></TreeViewItem>
    <TreeViewItem Header="XXX-2"></TreeViewItem>
    <ContentControl>
        <TreeViewItem Header="YYY-1"></TreeViewItem>
    </ContentControl>            
    <TreeViewItem Header="XXX-3"></TreeViewItem>
</TreeView>

上面的代码生成一个树状视图,如下所示

XXX-1 XXX-2 YYY-1 XXX-3 XXX-1 XXX-2 YYY-1 XXX-3
我认为ContentControl本身添加了另一个TreeViewItem。如何将树元素对齐在一起

它确实将ContentControl嵌套在TreeViewItem中(请参见下面的屏幕截图)

Snoop还告诉我,额外的边距用于+/-扩展器,因此,如果要保持树视图项嵌套,可能必须覆盖模板以除去该边距

当然,如果您只是想在TreeView项目中放置ContentControl,那么标签应该是另一种方式

<TreeViewItem Header="YYY-1">
    <ContentControl />
</TreeViewItem> 

我将从Rachel的答案开始,但删除ContentControl。您可以使用两个DataTemplates和一个分配给TreeViewItem的ItemTemplateSelector属性的ItemTemplateSelector来实现这一点

将复杂类型和简单类型定义为两个数据模板。然后编写一个从DataTemplateSelector继承的类,该类确定TreeViewItem中应该使用复杂类型还是简单类型。然后将TreeViewItem的ItemTemplateSelector设置为刚刚创建的DataTemplateSelector对象。下面是一个示例:


下面是另一个链接,它向您展示了如何根据条件选择DataTemplate:。搜索标题根据数据对象的属性选择DataTemplate

将TreeViewItem添加到ContentControl的目标是什么?@Josh:请查看我写给Orchestrator的评论。在下面给出一个答案,这个答案应该对你有用。覆盖模板是什么意思?是否可以更改树视图中ContentTemplate的呈现方式,使其仅充当占位符?顺便说一句,我不知道Snoop,它是一个非常方便的工具,谢谢。@user1106026默认情况下,WPF控件是“无外观的”,这意味着它们在屏幕上的显示方式不在控件本身中定义。相反,WPF使用模板来确定如何在屏幕上绘制UI对象,这些模板可以被覆盖。例如,Snoop屏幕截图显示,
树视图项
被绘制为一个
网格
,其中包含一个
扩展器
和一个
边框
,而
边框
包含
ContentPresenter
。您可以覆盖它,使其仅绘制
ContentPresenter