我已经使用Tree
和TreeView
创建了一个应用程序,用户可以在其中添加和删除
动态节点。
我在树中使用三个不同的图标来标记各种事物,使用普通的方法创建StackPanel(代码不在XAML中)。
现在我必须为从文件系统添加的每个节点加载这些图标,这会消耗大量的资源和内存,因为我找不到一种方法来“重用”节点之间的图标。树。
我尝试在开始时创建三个默认图像但我只能将它们用于三个节点,第四个节点抱怨并说项目(图像)已经在使用中。
我在互联网上看到了创建ImageList的一些可能性,但这些似乎与TreeViewitem
相关,这意味着我必须为每个节点创建一个新的ImageList
?
或者可以在所有节点之间重用相同的ImageList
吗?
答案 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#code :
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"];