Winforms: 在TreeView中应用Vista Explorer的新风格

     从Vista开始,Windows的Explorer树型控件采用了新的风格。之前,如果在树的某结点前面有一个+或者-,用来表示该结点有子结点。而+/-表示结点的状态:+表示该结点可以打开并显示它的子结点,-表示该结点可以收缩并隐藏它的子结点。结点与它的子结点之间用虚线连接。在Vista的Explorer中,+/-被三角形所替代。三角形顶点的朝向表示结点的状态。同时,把鼠标移到某三角形上,三角形显示为蓝色表示高亮。结点和子结点之间没有虚线连接。当Explorer失去焦点的时候,所有结点前的三角形都会慢慢消失;但Explorer再次得到焦点的时候,所以结点前的三角形又会重新出现。由于在Vista的Explorer用三角形表达了更多信息,并且有一定的动画,推出之后很多Windows用户都很喜欢。

    非常遗憾的是,Winforms到目前为止还没有支持这种新的树状控件。不过,Winforms程序员可以自己加少量的代码在TreeView上应用新的风格。下面的Utility类就是一个例子,以应用Vista Explorer新的树状风格:

internal class Utility

    {

        const int TV_FIRST = 0x1100;

        const int TVM_SETEXTENDEDSTYLE = TV_FIRST + 44;

        const int TVM_GETEXTENDEDSTYLE = TV_FIRST + 45;

        const int TVS_EX_FADEINOUTEXPANDOS = 0x0040;

        const int TVS_EX_DOUBLEBUFFER = 0x0004;

 

        [DllImport("uxtheme.dll", CharSet = CharSet.Auto)]

        public extern static int SetWindowTheme(IntPtr hWnd, string subAppName, string subIdList);

 

        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public extern static IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

 

        private static int TreeView_GetExtendedStyle(IntPtr handle)

        {

            IntPtr ptr = SendMessage(handle, TVM_GETEXTENDEDSTYLE, IntPtr.Zero, IntPtr.Zero);

            return ptr.ToInt32();

        }

 

        private static void TreeView_SetExtendedStyle(IntPtr handle, int extendedStyle, int mask)

        {

            SendMessage(handle, TVM_SETEXTENDEDSTYLE, new IntPtr(mask), new IntPtr(extendedStyle));

        }

 

        // Modify a WinForms TreeView control to use the new Explorer style theme

        public static void ApplyTreeViewThemeStyles(TreeView treeView)

        {

            if (treeView == null)

            {

                throw new ArgumentNullException("treeView");

            }

 

            treeView.HotTracking = true;

            treeView.ShowLines = false;

 

            IntPtr hwnd = treeView.Handle;

            SetWindowTheme(hwnd, "Explorer", null);

            int exstyle = TreeView_GetExtendedStyle(hwnd);

            exstyle |= TVS_EX_DOUBLEBUFFER | TVS_EX_FADEINOUTEXPANDOS;

            TreeView_SetExtendedStyle(hwnd, exstyle, 0);

        }

    }

在下面的例子中,在Form1中添加了两个TreeView,treeView1和treeView2。treeView1全部采用缺省的设置。treeView2同样也用缺省设置,但在Form1的构造函数的最后,调用函数Utility.ApplyTreeViewThemeStyles(treeView2)。两个TreeView的视觉效果见如下截图。


之前发布的作废,这是从老外的源码转换过来,并进行了扩展: 1>添加了水平和垂直网格线 2>添加了MVVM 3>添加了UI虚拟化的支持 4>支持自动填充列和最小宽度列 5>可绑定到Datatable,从而进行编辑操作 6>可装载海量数据,单层数据超过1W,瞬间完成,50W数据的滚动不卡顿 7>集成到ComboBox 8>有两个主题,一个有类似传统的有折叠连接线的主题,另一个是当下的。 个人比较喜欢有折叠连接线的,结构可以更清晰。 特别强调一点:在海量数据的情况下,如果虚拟化UI开启,在展开大量数据的情况下,执行滚动操作可能导致程序假死,原因不明,希望有人能找到原因,并能告知!另外对于系统自带的TreeView测试发现,如果展开第二层,该层数据量很大,拖放也很卡,但DataGrid却非常顺滑,怀疑微软对层次结构的UI虚拟化仍没做好。 另外就个人感觉在目前的电脑配置下,UI虚拟化可以显著提高数据的加载速度,但一旦数据已加载后,执行拖放操作时,顺滑程度远不于非虚拟化的情况,原因也很简单,只要内存还够用,UI已加载的拖放肯定比UI虚拟的拖放好。 这次针对之前的发布主要在于完全取消了虚拟化,因为虚拟化会导致在大数据下滚动的卡死,垂直网格线不随滚动条滚动等各种意外的问题。 另外与树有关的: WPF TreeView的横向排布风格20170722(带动画) http://download.csdn.net/detail/maiker/9907400 Email: wuyang26@live.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值