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

TreeViewItemを の中に入れるべきではないと思いますHierarchicalDataTemplate

これを試して:

<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 に答える