1

(使用 VS 2010)我是 WPF 的新手,正在尝试创建一个 TreeViewItem,它显示 2 个图像,然后是一些文本。为此,我正在使用 StackPanel。我希望根据模型属性的更改显示/隐藏第一张图像,因此我添加了一个触发器以将其宽度设置为 0:

 <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">

                <StackPanel Orientation="Horizontal" Margin="2" SnapsToDevicePixels="True" Width="Auto">
                    <Image Width="16" Height="16">
                        <Image.Style>
                            <Style TargetType="{x:Type Image}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding LinkType}" Value="Co">
                                        <Setter Property="Source" Value="/Images/Image1.png"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding LinkType}" Value="Post">
                                        <Setter Property="Width" Value="0"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>

                    <Image Source="/Images/Image2.png"
                        Width="15"
                        Height="15"
                        SnapsToDevicePixels="True" Margin="3,0"/>
                    <TextBlock Text="{Binding Name}" Margin="5,0" />
                </StackPanel>



            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

这实际上隐藏了图像,但留下了一个空白 - 堆栈面板中的剩余项目不会向左滑动以解释第一张图像的“移除”。我还尝试以相同的结果触发 Visibility。

有没有办法可以在 StackPanel 中添加/删除、显示/隐藏或更改 width=0 等项目,以便其余项目相应地重新调整它们的位置?或者有没有比 stackpanel 更好的容器呢?

4

1 回答 1

1

是的。当您使用 TreeView 时,TreeView 的直接“子项”实际上并不是您的 Image 控件 - 您的 Image 控件包含在 TreeViewItem 控件中。这些是自动生成的,并允许 TreeView 以更直观的方式处理其子项(无需强制所有控件实现 TreeView 子项所需的属性/功能)。

自定义这些 TeeViewItem 很容易。它们与您的图像共享相同的 DataContext,因此您可以像这样设置 TreeView.ItemContainerStyle:

<TreeView>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding LinkType}" Value="Post">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers> 
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>
于 2012-09-10T14:44:55.830 回答