不同的WPF Treeview图标取决于节点的类型
问题描述:
我需要将图像添加到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>
下面是输出的屏幕截图
可能有人请建议我怎么能做到这一点,可能的解决方案可以要么改变XAML,要么通过C#编程。
答
下面是我用来解决几乎相同的问题的一些代码。 (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 "";
}
}
您好AkselK,我很新的WPF能请你解释一下 和xaml必须放置在哪里?我把它放在标签,但即时获取以下编译时错误 - “我的”是一个未声明的前缀 –
啊,我明白了。 my:是一个名称空间,它在xaml顶部的或标记中声明。在我的情况下,我已经声明我的:xmlns:my =“clr-namespace:NodeExplorer2”就你而言,它将是xmlns:my =“clr-namespace:Your_project_name”。上述所有代码都在您的第一个实际组件(可能为)之上的或中声明。 my:PathConverter意味着我声明了一个PathConverter类型的对象,而x:Key = iconConverter意味着我可以通过{StaticResource iconConverter}来引用它。 –
AkselK
很酷,非常感谢你的解释!我只需要添加一些方法来检查一个特定的节点是否有任何孩子,如果没有,那么我将节点图像更改为一个孩子图标......标记为已回答 –