How to implement WPF TreeView with icons
[Sergei Meleshchuk. https://blogs.msdn.com/sergeim/\]
The trick is to use StackPanel (example below). The StackPanel contains image and text.
One of many ways to implement this is:
- Create folder with icons and deploy the folder to the same directory where the .exe file lives.
Note: If using IDE, copy this folder from project directory to target with the post-build step:
xcopy /sy "$(ProjectDir)icons\*" "$(TargetDir)icons\*"
- When initializing your app, compute location of the 'icons' folder:
Settings.IconsFolder = GetIconFolder(); // IconsFolder is string
where the 'GetIconsFolder' is like below:
private string GetIconFolder()
{
string execName =
Assembly.GetExecutingAssembly().
GetModules()[0].FullyQualifiedName;
string currentFolder = System.IO.
Path.GetDirectoryName(execName);
string icons = System.IO.Path.Combine(
currentFolder, "icons");
return icons;
}
- Add TreeViewItem with the code like below:
TreeViewItem tvi = CreateTreeViewItem(
"samplename",
Settings.IconsFolder,
"sample.ico");
treeView1.Items.Add(tvi);
where the 'CreateTreeViewItem' is your little wrapper:
private TreeViewItem CreateTreeViewItem(
string header,
string iconFolder,
string iconName)
{
TreeViewItem child = new TreeViewItem();
StackPanel pan = new StackPanel();
if (iconName != null)
{
pan.Orientation = Orientation.Horizontal;
IconBitmapDecoder icon = new IconBitmapDecoder(
new Uri(System.IO.Path.Combine(
iconFolder,
iconName),
UriKind.RelativeOrAbsolute),
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
Image image = new Image();
image.Height = 16;
image.Source = icon.Frames[0];
pan.Children.Add(image);
}
pan.Children.Add(new TextBlock(new Run(" " + header)));
child.Header = pan;
return child;
}
That's it.
Comments
Anonymous
January 06, 2011
Thank you for making this so simple and saving me days of work.Anonymous
March 04, 2011
The comment has been removedAnonymous
December 26, 2011
Hi, How can I exploit your function ? For get the SelectItem, when I clicking on the Treeview ? Best regards, Philippe G.Anonymous
August 12, 2015
thank you so much! easily the best and simplest implementation i have seen thus far! XAML is still confusing to me lol! Thanks a ton again!