给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 ...
随机推荐
- PyQt5 问题集
PyQt5中遇到的一些问题 1.多线程中界面异步刷新 我这里需要给界面动态添加新的控件,但是多线程中似乎并不能直接更新页面? 对于逻辑和界面分离的情况,使用自定义信号的方式进行页面控件的动态添加.注意 ...
- GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载!
GitHub Ribbons : 谈网站的安全性-资源链接如何 预防/实现 爬虫的批量下载! 预防方法: 1. 使用随机数字符串,拼接URL! https://camo.githubuserconte ...
- SVG 与 Canvas 对比
SVG 与 Canvas 对比 技术选型 SVG vs Canvas 应用场景 性能 GPU 加速 XML 数据存储 Canvas 2D Canvas 3D WebGL / OpenGL ES thr ...
- kahoot
kahoot Make learning awesome! https://kahoot.it/ https://kahoot.com/ 我们的平台可让您在几分钟内轻松创建,共享和玩学习游戏或琐事测验 ...
- CSS rulesets
CSS rulesets https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax#CSS_rulesets https://css-tricks ...
- TypeScript & global.d.ts
TypeScript & global.d.ts https://www.typescriptlang.org/docs/handbook/declaration-files/template ...
- js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process
js in depth: event loop & micro-task, macro-task & stack, queue, heap & thread, process ...
- c++ 使用PID获取可执行文件路径
注意看备注 https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getmodulefilenameexa #includ ...
- C++算法代码——笨小猴
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1163 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了 ...
- JVM性能调优经验总结
本文转载自JVM性能调优经验总结 说明 调优是一个循序渐进的过程,必然需要经历多次迭代,最终才能换取一个较好的折中方案. 在JVM调优这个领域,没有任何一种调优方案是适用于所有应用场景的,同时,切勿极 ...