E' possibile ottenere tutti questi effetti anche con il controllo TreeView del .NET Framework, utilizzando opprtunamente il Platform Invoke per modificare il suo stile:
1 using System.Windows.Forms;
2 using System.Runtime.InteropServices;
3
4 namespace System.Windows.Form.Vista
5 {
6 public class TreeViewEx : TreeView
7 {
8 private const int TV_FIRST = 0x1100;
9 private const int TVM_SETEXTENDEDSTYLE = TV_FIRST + 44;
10 private const int TVM_GETEXTENDEDSTYLE = TV_FIRST + 45;
11 private const int TVS_NOHSCROLL = 0x8000;
12 private const int TVS_EX_AUTOHSCROLL = 0x0020;
13 private const int TVS_EX_FADEINOUTEXPANDOS = 0x0040;
14
15 [DllImport("user32.dll", CharSet = CharSet.Unicode)]
16 private static extern int SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
17 [DllImport("user32.dll", CharSet = CharSet.Unicode)]
18 private static extern void SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
19 [DllImport("user32.dll", CharSet = CharSet.Unicode)]
20 private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
21 [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
22 private extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList);
23
24 public TreeViewEx()
25 {
26 base.HotTracking = true;
27 base.ShowLines = false;
28 }
29
30 protected override CreateParams CreateParams
31 {
32 get
33 {
34 CreateParams cp = base.CreateParams;
35 cp.Style |= TVS_NOHSCROLL;
36 return cp;
37 }
38 }
39
40 protected override void OnHandleCreated(EventArgs e)
41 {
42 base.OnHandleCreated(e);
43
44 int style = SendMessage(base.Handle, TVM_GETEXTENDEDSTYLE, 0, 0);
45 style |= (TVS_EX_AUTOHSCROLL | TVS_EX_FADEINOUTEXPANDOS);
46 SendMessage(base.Handle, TVM_SETEXTENDEDSTYLE, 0, style);
47 SetWindowTheme(base.Handle, "explorer", null);
48 }
49 }
50 }
In particolare, come mostrato alle linee 26-27, per ottenere una TreeView che si comporta esattamente come quella di Explorer è fondamentale che le sue proprietà HotTracking e ShowLines siano impostate, rispettivamente, su true e su false.