Добавить значок в WPF TreeViewItem во время выполнения - PullRequest
2 голосов
/ 01 декабря 2010

Существует множество примеров, демонстрирующих это в XAML, например:

<TreeViewItem>
<TreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="..."/>
<TextBlock>Hello</TextBlock>
</StackPanel>
</TreeViewItem.Header>

</TreeViewItem>

Но мне нужно сделать это в коде времени выполнения - цель TreeView - показать файлы и папки на компьютере.

Так что я не уверен, как работать с заголовком в коде:

 For Each f In directory.GetFiles()

        Dim icon = System.Drawing.Icon.ExtractAssociatedIcon(f.FullName)
        Dim name As String = f.Name    

        Dim item As New TreeViewItem
         item.Header = ...


 Next

Может кто-нибудь продемонстрировать концепцию, пожалуйста?

РЕДАКТИРОВАТЬ: Я думаю, что я понимаю, я должен использовать горизонтальную StackPanel с двумя отдельными элементами управления - TextBlock и Image. Это правильный подход?

1 Ответ

2 голосов
/ 01 декабря 2010

.

Вот пример кода того, как вы должны начать. Сначала поймите это, а затем внесите соответствующие изменения, чтобы удовлетворить ваши потребности. Код написан на C # и XAML. Надеюсь, вы поймете C # и сможете конвертировать его в Basic.

    public class NameIconPair
    {
        public String Name { get; set; }
        public BitmapSource IconSource { get; set; }
    }

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            var files = System.IO.Directory.GetFiles("E:\\");
            ObservableCollection<NameIconPair> pairs = new ObservableCollection<NameIconPair>();
            foreach (string file in files)
            {
                System.Drawing.Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(file);
                Stream stream = new MemoryStream();
                icon.Save(stream);
                BitmapDecoder decoder = IconBitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
                BitmapSource src = decoder.Frames[0];
                pairs.Add(new NameIconPair() { Name = file,  IconSource = src });
            }
            this.DataContext = pairs;
        }
    }

А вот код XAML:

    <TreeView ItemsSource="{Binding}">
        <TreeView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding IconSource}"/>
                    <TextBlock Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Надеюсь, этот пример кода вам очень поможет. : -)

.

...