none
C#的TreeView控件能不能设置单击鼠标就展开节点啊? RRS feed

  • 问题

  • C#的TreeView控件能不能设置单击鼠标就展开节点啊?

    另外为何在Win7下运行程序,TreeView的样式还是XP的?不能按照WIN7的风格来显示的吗?


    da jia hao!

    2014年3月26日 4:51

答案

  • Hi, 关于单击展开,可以再NodeMouseClick事件里面控制,如下所示:

            private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                if (e.Node.Bounds.Contains(e.Location))
                {
                    if (e.Node.IsExpanded)
                    {
                        e.Node.Collapse();
                    }
                    else
                    {
                        e.Node.Expand();
                    }
                }
            }

    关于Win7风格,刚好我之前用过一个设置TreeView风格的类,分享给你,可以直接使用:

    class Win7StyleHelper
        {
            private const int TvFirst = 0x1100;
            private const int TvmSetextendedstyle = TvFirst + 44;
            private const int TvmGetextendedstyle = TvFirst + 45;
            private const int TvsExFadeinoutexpandos = 0x0040;
            private const int TvsExDoublebuffer = 0x0004;
    
            private static class NativeMethods
            {
                [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
                public static extern int SetWindowTheme(IntPtr hWnd, string subAppName, string subIdList);
    
                [DllImport("user32.dll")]
                public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
            }
    
            private static int TreeViewGetExtendedStyle(IntPtr handle)
            {
                int ptr = NativeMethods.SendMessage(handle, TvmGetextendedstyle, IntPtr.Zero, IntPtr.Zero).ToInt32();
                return ptr;
            }
    
            private static void TreeViewSetExtendedStyle(IntPtr handle, int extendedStyle, int mask)
            {
                NativeMethods.SendMessage(handle, TvmSetextendedstyle, new IntPtr(mask), new IntPtr(extendedStyle));
            }
    
            public static void ApplyTreeViewThemeStyles(TreeView treeView)
            {
                if (treeView == null)
                {
                    throw new ArgumentNullException("treeView");
                }
    
                treeView.HotTracking = true;
                treeView.ShowLines = false;
    
                IntPtr hwnd = treeView.Handle;
                NativeMethods.SetWindowTheme(hwnd, "Explorer", null);
                int exstyle = TreeViewGetExtendedStyle(hwnd);
                exstyle |= TvsExDoublebuffer | TvsExFadeinoutexpandos;
                TreeViewSetExtendedStyle(hwnd, exstyle, 0);
            }
        }
    调用以下方法即可给treeView设置Win7风格
    Win7StyleHelper.ApplyTreeViewThemeStyles(treeView);


    • 已标记为答案 liubin 2014年3月26日 17:16
    2014年3月26日 7:20

全部回复

  • Hi, 关于单击展开,可以再NodeMouseClick事件里面控制,如下所示:

            private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                if (e.Node.Bounds.Contains(e.Location))
                {
                    if (e.Node.IsExpanded)
                    {
                        e.Node.Collapse();
                    }
                    else
                    {
                        e.Node.Expand();
                    }
                }
            }

    关于Win7风格,刚好我之前用过一个设置TreeView风格的类,分享给你,可以直接使用:

    class Win7StyleHelper
        {
            private const int TvFirst = 0x1100;
            private const int TvmSetextendedstyle = TvFirst + 44;
            private const int TvmGetextendedstyle = TvFirst + 45;
            private const int TvsExFadeinoutexpandos = 0x0040;
            private const int TvsExDoublebuffer = 0x0004;
    
            private static class NativeMethods
            {
                [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
                public static extern int SetWindowTheme(IntPtr hWnd, string subAppName, string subIdList);
    
                [DllImport("user32.dll")]
                public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
            }
    
            private static int TreeViewGetExtendedStyle(IntPtr handle)
            {
                int ptr = NativeMethods.SendMessage(handle, TvmGetextendedstyle, IntPtr.Zero, IntPtr.Zero).ToInt32();
                return ptr;
            }
    
            private static void TreeViewSetExtendedStyle(IntPtr handle, int extendedStyle, int mask)
            {
                NativeMethods.SendMessage(handle, TvmSetextendedstyle, new IntPtr(mask), new IntPtr(extendedStyle));
            }
    
            public static void ApplyTreeViewThemeStyles(TreeView treeView)
            {
                if (treeView == null)
                {
                    throw new ArgumentNullException("treeView");
                }
    
                treeView.HotTracking = true;
                treeView.ShowLines = false;
    
                IntPtr hwnd = treeView.Handle;
                NativeMethods.SetWindowTheme(hwnd, "Explorer", null);
                int exstyle = TreeViewGetExtendedStyle(hwnd);
                exstyle |= TvsExDoublebuffer | TvsExFadeinoutexpandos;
                TreeViewSetExtendedStyle(hwnd, exstyle, 0);
            }
        }
    调用以下方法即可给treeView设置Win7风格
    Win7StyleHelper.ApplyTreeViewThemeStyles(treeView);


    • 已标记为答案 liubin 2014年3月26日 17:16
    2014年3月26日 7:20
  • 微软的人士能不能解释一下为何.net不支持直接使用WIN7风格的TreeView?为什么让.net开发的程序在Win7下还披着XP的外衣?!

    da jia hao!

    2014年3月26日 17:17