給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遲遲不更新標簽頁的相關操作就是因為這個原因,笑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM