2011-08-19 79 views
2

我已经提出了一个TreeTreeView的应用程序,用户可以在其中动态添加和删除 节点。C#,WPF,Treeview中的重用图像

我在树中使用三种不同的图标来标记各种东西,通过使用创建StackPanel的普通方式(代码不在XAML中)。

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

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

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

还是可以在所有节点之间重复使用相同的ImageList

回答

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#代码

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"];