给Winform中的TabControl添加更现代的拖拽功能
上周接到一个开发任务,大致是允许APP中的Tab拖动以成为一个独立Tab,脱离之前的TabControl,就是现在Web拖动标签页创建新窗口的功能,现在浏览器必备的功能,应该很简单,然而我司采用的Dotnetbar框架中的TabControl关于拖拽操作并没有提供多少改造的余地,我顿时想起了当年高中装个Win7测试版也可自称geek的年代,那时候摆弄完系统也得和群里的大佬讨论什么浏览器才配得上geek的我,就是那时候发现IE没有支持拖动标签页,双击标签页等一些其他浏览器早就具备的功能,如今不觉有几分宿命感。
话又说回来,新功能需要配套同系统下多款软件,以我目前的权限不可能对原界面进行重构,所以还是得在现有的界面下实现该功能,在实际工作中我将其改为了通过右键菜单实现该功能,然而我现在要在实现原理上,推演一下如何在TabControl上实现真正的拖拽独立Tab功能。
其实在我将其改为右键菜单实现之前,我已经将原定的拖拽功能初步实现,但在考虑过后还是改为前者。原理上都是一样的,将选定的Tab放到一个供独立展示且可拖动的TabControl中,然后把原来的Tab dispose掉。导致我放弃通过拖拽实现的原因,一是我司采用的TabControl对Tab的操作只提供了多个Tab存在时,前后插入判断的反馈;二是Tab不能跨越属于自己的TabControl,放到另一个TabControl中去,这样就使得拖拽的用处更加鸡肋,通过拖拽使之独立,亦要拖拽使之还原,结合第一点,更涉及到新TabControl中的Tab归属判断和割离,工作量估计不止翻倍,开了这个口子,指不定要拖些什么幺蛾子......
又扯远了,通过拖拽实现需要克服的是第一点,由于这个原因,我们只能自己定制一套反馈判断,我们假定拖拽一定距离后便判定为需要new control,首先要判断用户开始拖拽,要用到MouseDown,然后在这个状态下计算鼠标移动距离,满足距离条件后即可new,亦或者松开鼠标即MouseUp之后new,当然,不论什么时候new,new完之后要记得break,因为我们只需要一个Tab页面就可以了,最后如果要实现Tab合并或者归位,则要计算移动至一定量的重叠区域即可,遗憾的是由于我上文所述的两点,实现合并操作所需要的工作量是可以预见的,如果有人要实操一下,我建议在MouseDown之时,以Mouseposition上划分一块Tab标签同样大小的区域,方便之后的重叠区域和相关判定计算。
关于供以独立TabControl拖动的容器选择也值得讨论,我曾在新窗口和Bar之间犹豫,最终选择了Bar,dotnetbar.Bar这个控件非常好用,就是内部结构有一点复杂,网上也有相关文章,我就不赘述了,本考虑通过Bar的特性来实现Tab的拖拽合并操作,但还是之前说的,Tab本身不支持在不同TabControl之间跨越合并,这一点极大地限制了拖拽功能的后续开发,指不定当初IE迟迟不更新标签页的相关操作就是因为这个原因,笑。
给Winform中的TabControl添加更现代的拖拽功能的更多相关文章
- html5中的拖拽功能
拖拽元素支持的事件 ondrag 应用于拖拽元素,整个拖拽过程都会调用 ondragstart 应用于拖拽元素,当拖拽开始时调用 ondragleave 应用于拖拽元素,当鼠标离开拖拽元素是调用 on ...
- 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”
通过源码了解ASP.NET MVC 几种Filter的执行过程 一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...
- Winform中的dataGridView添加自动编号
1.Winform中的dataGridView添加自动编号:http://blog.csdn.net/ohyoyo2014/article/details/38346887 2.如何为datagrid ...
- winform中文本框添加拖拽功能
对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...
- PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法
我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...
- 让Web页面中的编辑器支持黏贴或直接拖拽来添加图片
基本原理是将剪贴板中的图片二进制数据转为Base64编码 代码: <html> <head> </head> <body> <script src ...
- Winform中TextBox控件开启自动提示补全功能
问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性: ① AutoComp ...
- WinForm实现简单的拖拽功能(C#)(2)
首先创建一个winform应用程序,添加listbox1与listbox2,拖拽listbox1的项到listbox2上去. 具体代码如下 namespace OLE拖拽{ public partia ...
- C#之winform实现文件拖拽功能
将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter ...
随机推荐
- map最最最基本用法
map<a,b>c中,a,b是变量类型 参数定义的map的名字 #include<stdio.h> #include<map> //头文件 map<int,c ...
- Leetcode(213)-打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在 ...
- Linux 驱动框架---dm9000分析
前面学习了下Linux下的网络设备驱动程序的框架inux 驱动框架---net驱动框架,感觉知道了一个机器的大致结构还是不太清楚具体的细节处是怎么处理的,所以今天就来以dm9000这个网上教程最多的驱 ...
- Python求二维数组中某列的最大值
主要运用np.amax() import numpy as np help(np.amax) a = np.arange(9).reshape((3, 3)) max_all = np.amax(a) ...
- 十大排序算法时间复杂度 All In One
十大排序算法时间复杂度 All In One 排序算法时间复杂度 排序算法对比 Big O O(n) O(n*log(n)) O(n^2) 冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 ...
- 算法的时间复杂度 & 性能对比
算法的时间复杂度 & 性能对比 累加算法性能对比 // js 累加算法性能对比测试 const n = 10**6; (() => { console.time(`for`); let ...
- 如何在 macOS 上搭建 PHP 开发环境
如何在 macOS 上搭建 PHP 开发环境 Linux, Nginx, MySQL, PHP $ php --version $ php -v # PHP 7.3.11 (cli) (built: ...
- WiFi & QR Code
WiFi & QR Code https://github.com/bndw/wifi-card https://wifi.dev.bdw.to/ 扫码登录 WIFI:T:WPA;S:free ...
- jsbridge 原理 & 通信原理
jsbridge 原理 & 通信原理 Hybrid 方案是基于 WebView 的,JavaScript 执行在 WebView 的 Webkit 引擎中; 因此,Hybrid 方案中 JSB ...
- taro alipay
taro alipay 开发指南 https://nervjs.github.io/taro/docs/GETTING-STARTED.html#支付宝小程序 { "name": ...