前文 本文只對筆者學習掌握的一般的拖動問題的實現方法進行整理和討論,包括視窗、控制項等內容的拖動。 希望本文能對一些尋找此問題的解決方法的人和一些剛入門的人一些幫助。筆者為WPF初學者,能得到各位的批評指正也是榮幸萬分。有更好更多的方法,勞煩與我分享,不勝感激。 本文的各種實現方法其他博客中也都有提及 ...
前文
- 本文只對筆者學習掌握的一般的拖動問題的實現方法進行整理和討論,包括視窗、控制項等內容的拖動。
- 希望本文能對一些尋找此問題的解決方法的人和一些剛入門的人一些幫助。筆者為WPF初學者,能得到各位的批評指正也是榮幸萬分。有更好更多的方法,勞煩與我分享,不勝感激。
- 本文的各種實現方法其他博客中也都有提及,很多文章內容詳實,有圖有代碼,筆者就不重覆造輪子了。就寫寫自己的一些理解吧。
關鍵詞
Window, UserControls, Drag
參考資料
http://www.cnblogs.com/DebugLZQ/archive/2013/05/07/3062733.html
這篇文章的介紹非常全面,基本覆蓋了所有拖動方法。值得學習參考。
正文
1. 視窗的拖拽
我們知道,滑鼠放在視窗的標題欄上按下就可以拖動窗體。我們要實現在視窗的全部地方或特定地方按下滑鼠左鍵實現拖動。
【推薦】 使用 DragMove()方法,可以完全勝任。
使用參考: http://www.cnblogs.com/DebugLZQ/archive/2013/05/07/3062733.html
---分割線---
其它:
1. 自定義標題欄,使用WindowChrome
適用於無邊框自定義窗體,又不想去實現雙擊全屏,標題欄右鍵菜單的情況。簡稱比較懶得情況。(個人感覺使用起來感覺可控性不是很好,還是自己重新設計舒服。ヽ(ー_ー)ノ
2. 利用SendMessage實現視窗拖動
適用於。。。我也不是很清楚,沒咋用過(`・ω・´)。原理就是通過向視窗發送API User32中包含的移動命令來實現移動。學習學習。
使用參考: https://www.cnblogs.com/zhouyinhui/archive/2009/08/28/1555870.html
順便分享一個互操作維基,可以查到所有Windows API的使用方法,用到的時候查一下非常方便。瞎吉爾百度可能會有錯誤答案的說。。
2.控制項的拖拽
【推薦】 使用Blend中的行為來實現拖動
強大的VS Blend提供了實現拖拽的行為(behavior),不用自己去計算和完成具體實現,使用起來極為方便,真正實現“點一下玩一年”,非常適合我這種懶人。
使用參考: https://www.cnblogs.com/YGYH/archive/2010/09/10/1822724.html
問題:這個拖拽行為雖然使用起來方便,但是只適用於子控制項在父容器中拖拽的情況。
---分割線---
其它:
1. 通過RenderTransform的TranslateTransform屬性實現
在二維 x-y 坐標系統內平移(移動)對象。
RenderTransform屬性可以實現界面的轉換、旋轉、縮放、傾斜、翻轉等各種功能。所以我們只需要獲得拖拽時改變的值後,就能對各種控制項進行位置轉換。
使用參考: https://blog.csdn.net/qq_18995513/article/details/62889383
2. 【推薦】Thumb控制項
表示可由用戶拖動的控制項。
依賴於父容器進行使用,可以通過控制項拖動時的屬性值就能獲取控制項的垂直變化量和水平變化量。拖動DeltaEventArgs類在使用時,可以將按鈕、圖片等需要實現拖拽的內容放到Thumb下,通過拖拽Thumb來實現內容物的拖拽。參考學習這篇博文的2.1項
3. Canvas容器中的子控制項,通過點擊下時記錄的點,然後計算移動時的點的變化量,來重新計運算元控制項與父容器的相對位置。
參考學習這篇博文的2.3項
4. Grid容器中的子控制項拖拽的實現方法與Canvas大同小異,參考學習這篇博文的2.4項
後文
以上應該就是在WPF中的各種拖拽的實現方法了,有簡單的,也有複雜的。具體使用哪個,應該還是要根據使用需求來用。不過常用的就那幾個(逃~