Treeviewitem与图像编程



我有用于创建TreeViewitems的代码,稍后将其添加到TreeView。这些都是通过编程完成的。

TreeViewItem tvi = new TreeViewItem {
                                        Header = ni.name,
                                        Uid = itemName,
                                        Background = color 
                                    };

我希望能够以编程方式添加图像作为TreeViewItems的图标。我正在这样做,但我在TreeView中看到的都是名为System.Windows.Controls.StackPanel的项目,这很奇怪。也没有图像显示。我在我的代码中使用这个。请帮助:

TreeViewItem tvi = new TreeViewItem
{
    Header = new System.Windows.Controls.StackPanel
    {
        Children = 
        {
            new System.Windows.Controls.Image{Source = b},
            new System.Windows.Controls.TextBlock
            {
                Text = ni.name
            }
        }
    },
    Uid = itemName,
    Background = color
};

我也尝试了XAML based方法。我的XAML based方法如下所示XAML:

<TreeView ItemsSource="{Binding}" Grid.Row="1" Grid.Column="0" Name="TreeView1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TreeViewItem.Selected="TreeViewItem_OnItemSelected">
    <TreeView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path= iName}" Margin="5,0" />    
            </StackPanel>
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

不像前面那样添加tvi,我这样做:

//  node.Items.Add(tvi); //for non-xaml approach
var ti = new TreeItem { iName = ni.name};
node.Items.Add(ti);

我的TreeItem类是这样的:

namespace DeveloperTool
{
    public class TreeItem
    {
        public string iName
        {
            get; set;
        }     
    }
}

即使对于我使用的这种方法,我也看到TreeViewItems的名称为DeveloperToolTreeItem,而不是我绑定到的实际名称。为了简单起见,我只是先尝试了TextBlock(不包括图像)。有人可以回顾一下我在这里做错了什么。两种方法都会导致相同的情况。

基于示例的问题是需要头模板。将这段代码添加到TreeView声明中…

        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image  Margin="2"  Source="{Binding ...}"/>
                                <TextBlock Text="{Binding}"></TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>

这给了你一个可以绑定到的HeaderTemplate。当然,您必须添加正确的绑定特性才能使此代码段编译和工作,否则大多数现有代码都可以保留。

最新更新