2011-11-25 90 views
2

我需要将图像添加到WPF treeview节点,我看过这个例子How do I add icons next to the nodes in a WPF TreeView?,它的工作正常,除了所有节点都有相同的图像。我想所有的树形视图中没有任何子节点的节点要么没有图像,要么具有不同的图像。不同的WPF Treeview图标取决于节点的类型

这是我的XAML,我设置图像:

<HierarchicalDataTemplate x:Key="NodeTemplate"> 
     <StackPanel Orientation="Horizontal" Margin="2"> 
      <Image Source="test.png" Width="16" Height="16" SnapsToDevicePixels="True"/> 
     <TextBlock x:Name="tb"/> 
     </StackPanel> 
     <HierarchicalDataTemplate.ItemsSource> 
      <Binding> 
       <Binding.XPath>child::node()</Binding.XPath> 
      </Binding> 
     </HierarchicalDataTemplate.ItemsSource> 
     <HierarchicalDataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
       <Setter TargetName="tb" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
       <Setter TargetName="tb" Property="Text" Value="{Binding Path=Name}"></Setter> 
      </DataTrigger> 
     </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 

下面是输出的屏幕截图

Treeview output 可能有人请建议我怎么能做到这一点,可能的解决方案可以要么改变XAML,要么通过C#编程。

回答

4

下面是我用来解决几乎相同的问题的一些代码。 (I设计了这个对数据是XML数据,所以的XPath =“@名称”指的是节点的属性名称的值,而名称意味着元素类型。)

<Window x:Class="NodeExplorer2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:my="clr-namespace:NodeExplorer2"> 
    <Window.Resources> 
     <my:PathConverter x:Key="iconConverter"/> 

     <HierarchicalDataTemplate x:Key="XmlTreeTemplate"> 
      <HierarchicalDataTemplate.ItemsSource> 
       <Binding XPath="child::node()" /> 
      </HierarchicalDataTemplate.ItemsSource> 

      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="icon" SnapsToDevicePixels="True" Stretch="None" Margin="0,0,3,0" /> 
       <TextBlock Text={Binding XPath="@name"/> 
      </StackPanel> 
      <HierarchicalDataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
        <Setter TargetName="icon" Property="Source"> 
         <Setter.Value> 
          <Binding Path="Name" Converter="{StaticResource iconConverter}"> 
           <Binding.FallbackValue> 
            <ImageSource> 
             Data/Icons/unknown.png 
            </ImageSource> 
           </Binding.FallbackValue> 
          </Binding> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
     </HierarchicalDataTemplate> 

转换器:

public class PathConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     //Console.WriteLine("Value:" + value); 
      return "Data/Icons/" + value + ".png"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ""; 
    } 
} 
+0

您好AkselK,我很新的WPF能请你解释一下和xaml必须放置在哪里?我把它放在标签,但即时获取以下编译时错误 - “我的”是一个未声明的前缀 –

+0

啊,我明白了。 my:是一个名称空间,它在xaml顶部的标记中声明。在我的情况下,我已经声明我的:xmlns:my =“clr-namespace:NodeExplorer2”就你而言,它将是xmlns:my =“clr-namespace:Your_project_name”。上述所有代码都在您的第一个实际组件(可能为)之上的中声明。 my:PathConverter意味着我声明了一个PathConverter类型的对象,而x:Key = iconConverter意味着我可以通过{StaticResource iconConverter}来引用它。 – AkselK

+0

很酷,非常感谢你的解释!我只需要添加一些方法来检查一个特定的节点是否有任何孩子,如果没有,那么我将节点图像更改为一个孩子图标......标记为已回答 –