C #, WPF, повторное использование изображений в Treeview - PullRequest
2 голосов
/ 19 августа 2011

Я сделал заявление с Tree и TreeView, где пользователь может добавлять и удалять узлы на лету.

Я использую три разных значка в дереве, чтобы пометить разные вещи, используя обычный способ создания StackPanel (в коде не в XAML).

Как сейчас, я должен загрузить эти значки для каждого из узлов, которые я добавляю из файловой системы, которая потребляет много ресурсов и памяти, потому что я не могу найти способ «повторного использования» значков между узлами в дерево.

Я пытался создать три изображения по умолчанию при запуске, но я мог использовать их только для трех узлов, четвертый узел жаловался и говорил, что элемент (изображение) уже используется.

Я видел в Интернете некоторые возможности создания ImageList, но кажется, что они связаны TreeViewitem, что означает, что мне нужно создать новый ImageList для каждого узла?

Или можно использовать один и тот же ImageList между всеми узлами?

1 Ответ

4 голосов
/ 23 октября 2011

Мне кажется, что вам нужно позвонить .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"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...