【问题标题】:Treeviewitem with images programmatically以编程方式带有图像的 Treeviewitem
【发布时间】:2013-06-02 00:01:11
【问题描述】:

我有这段代码用于创建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(不包括图像)。有人可以在这里查看我做错了什么。两种方法都会导致相同的情况。

【问题讨论】:

    标签: .net wpf treeview treeviewitem


    【解决方案1】:

    基于您的示例的问题是需要标题模板。将此 sn-p 添加到您的 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。当然,您必须添加正确的绑定功能才能让这个 sn-p 编译和工作,否则您现有的大部分代码都可以挽救。

    【讨论】:

    • 所以我应该摆脱 itemtemplate 并在 Resources 中使用它?
    • 是的,我发布的 Xaml 设置了 HeaderTemplate 属性,这就是您根据您发布的代码和 Xaml 所追求的。
    • 谢谢你。这样做了。我还有更多问题要让我的工作正常进行,但最好发布另一个关于它的问题。
    • 你很好,唯一真正的挂断是 headertemplate 部分:)
    • 当然 :) 但我不能真正成功。在这里发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-04-18
    • 2013-10-08
    相关资源
    最近更新 更多