2011-08-19 53 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"];