Различни икони на WPF Treeview в зависимост от типа възел

Трябва да добавя изображения към WPF дървовидни възли, разгледах този пример Как да добавя икони до възлите в 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, или програмно чрез ° С#.


person Denys Wessels    schedule 25.11.2011    source източник


Отговори (1)


Ето код, който използвах за решаване на почти същия проблем. (Данните, за които проектирах това, са XML данни, така че XPath="@name" означава стойността на името на атрибута на възела, докато Name означава тип елемент.)

<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 "";
    }
}
person AkselK    schedule 25.11.2011
comment
Здравей AkselK, съвсем нов съм в WPF, би ли могъл да обясниш какво е ‹my:PathConverter x:Key=iconConverter/› и къде в xaml трябва да се постави? Поставям го в маркера ‹Window.Resources›, но получавам следната грешка по време на компилиране - my е недеклариран префикс - person Denys Wessels; 25.11.2011
comment
ААА разбирам. my: е пространство от имена, което е декларирано в тага ‹window› или ‹usercontrol› в горната част на xaml. В моя случай аз съм декларирал моето: като xmlns:my=clr-namespace:NodeExplorer2. Във вашия случай това ще бъде xmlns:my=clr-namespace:Your_project_name. Целият горен код е деклариран в ‹Window.Resources› или ‹UserControl.Resources›, над вашия първи реален компонент (вероятно ‹Grid›). my:PathConverter означава просто, че декларирам обект от тип PathConverter, а x:Key=iconConverter означава, че мога да го реферирам чрез {StaticResource iconConverter}. - person AkselK; 25.11.2011
comment
Страхотно, благодаря много за обяснението! Току-що трябваше да добавя малък метод, който проверява дали определен възел има деца и ако НЕ, тогава променям изображението на възела на икона на дете... Маркирайки това като отговорено - person Denys Wessels; 28.11.2011