0

我知道 ControlTemplate 应该完全替换默认的,这在不使用 HierarchicalDataTemplate 时似乎有效。然而,使用 HierarchicalDataTemplate 我的控件模板似乎被部分使用 - TreeViewItem 是我指定的包含图像等的控件。但仍然显示为具有默认扩展器的节点以显示其子级 - 未在我的模板中指定(我想要我的孩子始终显示,但那不是重点)。它看起来像这样:

      <TreeView>
        <TreeView.Resources>

            <Style x:Key="MyNodeStyle" TargetType="TreeViewItem">
                <Setter Property="SnapsToDevicePixels" Value="true" />
                <Setter Property="OverridesDefaultStyle" Value="true"/>
                <Setter Property="IsExpanded" Value="true"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="TreeViewItem">
                            <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                                <Border CornerRadius="8" BorderThickness="1" Padding="2" Margin="4, 6" BorderBrush="{StaticResource itemBorderBrush}" Background="{StaticResource itemBackgroundBrush}" x:Name="border">
                                    <DockPanel LastChildFill="False">
                                        <StackPanel Orientation="Vertical" DockPanel.Dock="Top" Height="80">
                                            <TextBlock Text="{Binding Path=DisplayValue}" HorizontalAlignment="Center" FontWeight="Bold"/>
                                            <Image Source="MyNode.png" Stretch="None"/>
                                            <TextBlock Text="{Binding Path=Notes}" TextWrapping="Wrap" Width="150"/>                                                   
                                        </StackPanel>
                                    </DockPanel>
                                </Border>
                                <ItemsPresenter />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" IsItemsHost="True" HorizontalAlignment="Center" />
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

            <HierarchicalDataTemplate DataType="{x:Type src:MyNode}" ItemsSource="{Binding Path=Children}" >
                <TreeViewItem Style="{StaticResource MyNodeStyle}"/>
            </HierarchicalDataTemplate>

        </TreeView.Resources>

        <!-- Arrange the root items horizontally. -->
        <TreeView.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Center" />
            </ItemsPanelTemplate>
        </TreeView.ItemsPanel>

    </TreeView>

出于某种原因,仅在使用 HierarchicalDataTemplate 时,似乎没有应用 ItemsPanel 和 Setter,并且子项显示在默认扩展器中。当我使用自己的 ControlTemplate 时,那个扩展器是如何到达那里的!?@#$

4

1 回答 1

1

我认为您不应该TreeViewItemHierarchicalDataTemplate.

试试这个:

<HierarchicalDataTemplate DataType="{x:Type src:MyNode}" ItemsSource="{Binding Path=Children}" >
    <StackPanel Orientation="Vertical" DockPanel.Dock="Top" Height="80">
        <TextBlock Text="{Binding Path=DisplayValue}" HorizontalAlignment="Center" FontWeight="Bold"/>
        <Image Source="MyNode.png" Stretch="None"/>
        <TextBlock Text="{Binding Path=Notes}" TextWrapping="Wrap" Width="150"/>
    </StackPanel>
</HierarchicalDataTemplate>

现在,您的模板变为:

<ControlTemplate TargetType="TreeViewItem">
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
        <Border CornerRadius="8" BorderThickness="1" Padding="2" Margin="4, 6" x:Name="border">
            <DockPanel LastChildFill="False">
                <ContentPresenter ContentSource="Header" />
            </DockPanel>
        </Border>
        <ItemsPresenter />
    </StackPanel>
</ControlTemplate>

这就是你想要的样子吗?

编辑:原始扩展器可能在那里,因为您只将您的样式用于子项 - 将您的样式设置为树视图的 ItemContainerStyle:

<Window.Resources>
    <Style x:Key="MyNodeStyle" TargetType="TreeViewItem">
        ....

<TreeView ItemContainerStyle="{StaticResource MyNodeStyle}">
于 2011-04-04T02:50:57.220 回答