If retaining the SystemColors.Highlight
background color is all you wanted, then you don’t need to set the TreeView
‘s DrawMode
property to TreeViewDrawMode.OwnerDrawAll
. Setting it to TreeViewDrawMode.OwnerDrawText
should be sufficient, thus you don’t need to worry about drawing the TreeNode
‘s corresponding ImageKey
.
-
Set the
TreeView.DrawMode
toTreeViewDrawMode.OwnerDrawText
:treeView.DrawMode = TreeViewDrawMode.OwnerDrawText;
-
Set the
Treview.HideSelection
tofalse
, so that the node states will be kept as selected:treeView.HideSelection= false;
-
Add
DrawNode
event handler to draw the background usingSystemColors.Highlight
color:private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e) { if (e.Node == null) return; // if treeview's HideSelection property is "True", // this will always returns "False" on unfocused treeview var selected = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected; var unfocused = !e.Node.TreeView.Focused; // we need to do owner drawing only on a selected node // and when the treeview is unfocused, else let the OS do it for us if (selected && unfocused) { var font = e.Node.NodeFont ?? e.Node.TreeView.Font; e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds); TextRenderer.DrawText(e.Graphics, e.Node.Text, font, e.Bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding); } else { e.DrawDefault = true; } }