【问题标题】:Setting up WPF treeview triggers to show different images on expand设置 WPF 树视图触发器以在展开时显示不同的图像
【发布时间】:2011-08-13 10:17:38
【问题描述】:

我有一个 wpf 树视图,它显示各种类型的节点以及相应的图像,例如文件夹图像。最初,树及其具有相应图像的节点按预期显示。然而,当一个节点被扩展时,期望的是扩展节点的图像应该交换为扩展图像。我正在尝试使用HierarchicalDataTemplate 触发器进行设置。

是否应该以不同方式设置触发器?

这棵树看起来像:

(Folder Image) Solutions (SolutionsViewModel)
--(Solution Image) Solution 1 (Solution)
--(Solution Image) Solution 2 (Solution)
(Folder Image) Conventions (ConventionsViewModel)

树视图中主要节点的xaml(主题为空):

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Theme.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <HierarchicalDataTemplate DataType="{x:Type vm:SolutionsViewModel}" ItemsSource="{Binding Items}">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="nodeImg" Width="16" Height="16" Source="pack://siteOfOrigin:,,,/Resources/FolderClosed.bmp"/>
                <TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
            </StackPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsExpanded}" Value="True">
                    <Setter TargetName="nodeImg" Property="Source" Value="pack://siteOfOrigin:,,,/Resources//FolderOpen.bmp"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type sol:Solution}" ItemsSource="{Binding Items}">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="treeImg" Width="16" Height="16" Source="pack://siteOfOrigin:,,,/Resources/SolutionClosed.bmp"/>
                <TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
            </StackPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsExpanded}" Value="True">
                    <Setter TargetName="treeImg" Property="Source" Value="pack://siteOfOrigin:,,,/Resources//SolutionOpen.bmp"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type vm:ConventionsViewModel}" ItemsSource="{Binding Items}">
            <StackPanel Orientation="Horizontal">
                <Image x:Name="nodeImg" Width="16" Height="16" Source="pack://siteOfOrigin:,,,/Resources/FolderClosed.bmp"/>
                <TextBlock Margin="5,0,0,0" Text="{Binding Name}" />
            </StackPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsExpanded}" Value="True">
                    <Setter TargetName="nodeImg" Property="Source" Value="pack://siteOfOrigin:,,,/Resources//FolderOpen.bmp"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>
    </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
    <ObjectDataProvider 
    ObjectType="{x:Type vm:TreeViewModel}"
    MethodName="CreateDefaultTree"
    />
</UserControl.DataContext>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <Grid>
        <TreeView Name="solutionsModel" ItemsSource="{Binding Items}">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Setter Property="FontWeight" Value="Normal" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
        </TreeView>
    </Grid>
</ScrollViewer>

【问题讨论】:

    标签: wpf triggers treeview datatrigger hierarchicaldatatemplate


    【解决方案1】:

    This question 可能是相关的。

    正如我对所链接问题的回答一样,我将通过RelativeSource 绑定在图像中进行触发,您可以将其重构为一种样式,这样您就不会拥有所有冗余代码。

    您可以使用 DynamicResources 为每个图像控件提供两个图像,或者您可以将Image 子类化或创建一个提供属性的 UserControl。


    DynamicResource 方法:

    <TreeView.Resources>
        <Style x:Key="ExpandingImageStyle" TargetType="{x:Type Image}">
            <Setter Property="Source" Value="{DynamicResource Icon_Closed}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}" Value="True">
                    <Setter Property="Source" Value="{DynamicResource Icon_Open}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TreeView.Resources>
    
    <!-- Example usage -->
    <HierarchicalDataTemplate DataType="{x:Type obj:Employee}">
        <StackPanel Orientation="Horizontal">
            <Image Style="{StaticResource ExpandingImageStyle}">
                <Image.Resources>
                    <BitmapImage x:Key="Icon_Closed" UriSource="Images/FolderClosed.ico"/>
                    <BitmapImage x:Key="Icon_Open" UriSource="Images/FolderOpen.ico"/>
                </Image.Resources>
            </Image>
            <TextBlock Text="{Binding Name}"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    

    【讨论】:

      【解决方案2】:

      为了完整起见,带有HierarchicalDataTemplate 触发器的原始设置只需要使用RelativeSource 绑定(如HB 的回答所示),例如:

      <HierarchicalDataTemplate DataType="{x:Type svm:SolutionsViewModel}" ItemsSource="{Binding Items, Mode=OneWay}">
          <StackPanel Style="{StaticResource TreeViewItemStackPanelStyle}">
              <Image x:Name="nodeImg" Style="{StaticResource IconImageStyleSmall}" Source="{StaticResource Icon_FolderClosed}" />
              <TextBlock Style="{StaticResource TreeViewItemTextStyle}" />
          </StackPanel>
          <HierarchicalDataTemplate.Triggers>
              <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}" Value="True">
                  <Setter TargetName="nodeImg" Property="Source" Value="{Binding Source={StaticResource Icon_FolderOpen}, Mode=OneTime}"/>
              </DataTrigger>
          </HierarchicalDataTemplate.Triggers>
      </HierarchicalDataTemplate>
      

      以下是在TreeView 中展开不同图像的示例图像:

      【讨论】:

        猜你喜欢
        • 2015-04-11
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2012-09-09
        • 2015-01-30
        • 1970-01-01
        • 2012-12-16
        相关资源
        最近更新 更多