隐藏StackPanel项目 - >调整剩余项目位置

时间:2012-09-10 13:52:54

标签: .net wpf triggers

(使用VS 2010)我是WPF的新手,我正在尝试创建一个显示2个图像的TreeViewItem,然后是一些文本。要做到这一点,我正在使用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等项目,以便其余项目相应地重新调整其位置?或者是否有比堆叠面板更好的容器?

1 个答案:

答案 0 :(得分:1)

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

很容易定制这些TeeViewItems。它们与您的Images共享相同的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>