C#,WPF,在Treeview中重用图像

时间:2011-08-19 08:35:35

标签: c# wpf treeview

我已经使用TreeTreeView创建了一个应用程序,用户可以在其中添加和删除 动态节点。

我在树中使用三个不同的图标来标记各种事物,使用普通的方法创建StackPanel(代码不在XAML中)。

现在我必须为从文件系统添加的每个节点加载这些图标,这会消耗大量的资源和内存,因为我找不到一种方法来“重用”节点之间的图标。树。

我尝试在开始时创建三个默认图像但我只能将它们用于三个节点,第四个节点抱怨并说项目(图像)已经在使用中。

我在互联网上看到了创建ImageList的一些可能性,但这些似乎与TreeViewitem相关,这意味着我必须为每个节点创建一个新的ImageList

或者可以在所有节点之间重用相同的ImageList吗?

1 个答案:

答案 0 :(得分:4)

听起来您需要在图片上调用.Freeze()

虽然,我的应用程序中有类似的情况,这就是我做的方式(不使用.Freeze()):
XAML

    <TreeView Name="treeViewFolders" SelectedItemChanged="treeViewFolders_SelectedItemChanged" TreeViewItem.Expanded="treeViewFolders_Expanded" Margin="0,4,0,6">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="0,2">
                                <Image x:Name="img" Stretch="None" RenderOptions.BitmapScalingMode="NearestNeighbor" 
                                       Source="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TreeViewItem}, Path=DataContext}"/>
                                <TextBlock Text="{Binding}" Margin="5,0,10,0" />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>

c#c​​ode

private readonly System.Collections.Generic.Dictionary<string, ImageSource> typeIcons = new Dictionary<string, ImageSource>();

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        this.typeIcons.Add("winhdd", new BitmapImage(new Uri("Images/Icons/winhdd.png", UriKind.Relative)));
        this.typeIcons.Add("harddrive", new BitmapImage(new Uri("Images/Icons/hdd.png", UriKind.Relative)));
        this.typeIcons.Add("removable", new BitmapImage(new Uri("Images/Icons/removablehdd.png", UriKind.Relative)));
        this.typeIcons.Add("folder", new BitmapImage(new Uri("Images/Icons/folder.png", UriKind.Relative)));
}

我在创建节点的地方(作为示例):

TreeViewItem item = new TreeViewItem();
item.DataContext = this.typeIcons["harddrive"];