【问题标题】:C#, WPF, Reuse images in TreeviewC#,WPF,在 Treeview 中重用图像
【发布时间】:2011-08-19 08:35:35
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    在我看来,您需要在图片上调用 .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"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2017-07-09
      相关资源
      最近更新 更多