上周接到一个开发任务,大致是允许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添加更现代的拖拽功能的更多相关文章

  1. html5中的拖拽功能

    拖拽元素支持的事件 ondrag 应用于拖拽元素,整个拖拽过程都会调用 ondragstart 应用于拖拽元素,当拖拽开始时调用 ondragleave 应用于拖拽元素,当鼠标离开拖拽元素是调用 on ...

  2. 通过源码了解ASP.NET MVC 几种Filter的执行过程 在Winform中菜单动态添加“最近使用文件”

    通过源码了解ASP.NET MVC 几种Filter的执行过程   一.前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神 ...

  3. Winform中的dataGridView添加自动编号

    1.Winform中的dataGridView添加自动编号:http://blog.csdn.net/ohyoyo2014/article/details/38346887 2.如何为datagrid ...

  4. winform中文本框添加拖拽功能

    对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...

  5. PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法

    我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...

  6. 让Web页面中的编辑器支持黏贴或直接拖拽来添加图片

    基本原理是将剪贴板中的图片二进制数据转为Base64编码 代码: <html> <head> </head> <body> <script src ...

  7. Winform中TextBox控件开启自动提示补全功能

    问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性:   ① AutoComp ...

  8. WinForm实现简单的拖拽功能(C#)(2)

    首先创建一个winform应用程序,添加listbox1与listbox2,拖拽listbox1的项到listbox2上去. 具体代码如下 namespace OLE拖拽{ public partia ...

  9. C#之winform实现文件拖拽功能

    将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter ...

随机推荐

  1. codeforces 8B

    B. Obsession with Robots time limit per test 2 seconds memory limit per test 64 megabytes input stan ...

  2. 技术分享: Canvas 系列

    技术分享: Canvas 系列 SVG 导出 分享截图 加密水印 游戏 场馆图,选派选座 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可 ...

  3. ES2021 & ES12

    ES2021 & ES12 ES2021 new features replaceAll String.prototype.replaceAll const str = `abc,abc`; ...

  4. uniapp 发起网络请求

    推荐下我写的uni-http 创建http-config.js import Vue from 'vue' const BASE_URL = 'http://xxx.com'; if (process ...

  5. 大胆预计SPC算力空投收益,月收益22.8%

    此前,NGK官方公告表示,NGK算力持有者获得SPC的数量是根据200万枚SPC除以全网算力总量决定的. 举个例子,假设全网算力总量为500万,那么每个算力持有者如果持有一个算力,则可获得200万÷5 ...

  6. Vue 组件的通信方式都有哪些?

    说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1props ...

  7. gitLab的使用 和 git 、 github、gitlab的区别

    一.git . github.gitlab的区别  (百度相关内容得到的理解) ​ ​ 二.git最基本作用:版本控制 ​ 三.有集成了git的GIT安装包 github和gitlab都使用git该版 ...

  8. C++算法代码——求数列[coci2014/2015 contest #1]

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1815 题目描述 Mirko在数学课上以一种有趣的方式操作数列,首先,他写下一个数列A ...

  9. 配置伪分布模式下的hadoop以及采用fuse-dfs来访问HDFS

    实验目标 配置环境的主要目的是得到HDFS的客户端fuse-dfs的IO性能.本来的服务器上没有任何环境,因此安装均是从无到有的.系统是Ubuntu server 14.04 amd64.整个过程参考 ...

  10. 安装vue脚手架

    npm install -g @vue/cli 创建项目 vue create freemall