給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遲遲不更新標籤頁的相關操做就是由於這個緣由,笑。開發

相關文章
相關標籤/搜索