给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标签一样大小的区域,方便以后的重叠区域和相关断定计算。spa

  关于供以独立TabControl拖动的容器选择也值得讨论,我曾在新窗口和Bar之间犹豫,最终选择了Bar,dotnetbar.Bar这个控件很是好用,就是内部结构有一点复杂,网上也有相关文章,我就不赘述了,本考虑经过Bar的特性来实现Tab的拖拽合并操做,但仍是以前说的,Tab自己不支持在不一样TabControl之间跨越合并,这一点极大地限制了拖拽功能的后续开发,指不定当初IE迟迟不更新标签页的相关操做就是由于这个缘由,笑。开发

相关文章
相关标签/搜索