WPF中控件進行伸縮移動旋轉變換的經驗總結
(前記第一次寫博客主要目的是對知識做一個系統點的總結,這樣能夠使自己對使用過的相關技術能有一個更加深入和全面的認識。此外在博客園看到了很多非常棒的博客,通過閱讀和體會諸位的博客使自己收益匪淺。因此也有了想把自己的心得體會或是學習過程記錄下來通過博客園和大家分享,共同交流共同進步。)
本篇博客主要是想和大家分享WPF中使用的針對控件進行自由移動、拉伸、旋轉操作的具體實現方法和使用到的相關技術或說是類庫吧;
- 實現方法:
對於如何實現相關操作當然還是直接以Demo的方式介紹最為直觀的啦。
總結起來在這里移動、拉伸以及旋轉三種操作的實現實際是使用的相同的方法:即Thumb控件的使用,然后根據Thumb控件響應鼠標的拖放操作對控件進行相應的2D變化即可實現以上三種操作;
Demo:http://download.csdn.net/my(CSDN 下載地址)
2相關類的介紹
Thumb:都說了實現以上三種操作最主要是使用了Thumb控件,這里當然首先是對其進行介紹的啦。
(要想使用thumb 當然得知道它在哪個類庫嘛)
命名空間: System.Windows.Controls.Primitives
程序集: PresentationFramework(在 PresentationFramework.dll 中)
為了使Thumb分別實現移動、拉伸、旋轉的功能在程序中使用了自定義控件的方式分別構造了MoveThumb、ResizeThumb、RotateThumb三個繼承自Thumb的自定義控件。
使用自定義控件的好處是可以通過繼承自Thumb接受的鼠標拖放操作分別實現移動、拖放、以及拉伸操作,此外還可對自定義的控件設置相應的控件模板,通過在界面以及使鼠標顯示不同的形狀方便用戶區分不同的操作從而提升了用戶的操作體驗。
使用Thumb控件最重要的當然是利用thumb 提供 DragStarted, DragCompleted 和 DragDelta 事件來管理與鼠標指針相關的拖動操作。 當用戶按下鼠標左鍵時,Thumb 控件接收邏輯焦點和鼠標捕獲,並引發DragStarted 事件。 在 Thumb 控件具有焦點和鼠標捕獲的同時,可以無限制地多次引發 DragDelta 事件。 當用戶釋放鼠標左鍵時,Thumb 控件失去鼠標捕獲,並引發DragCompleted 事件
3 WPF 中的2D變換
在WPF中涉及的2D變換主要是與Transform相關的一系列變化。它的實現原理用到了二維變換矩陣的結構就是將一個空間的點映射或變換到另一個坐標空間。具體的實現方法其實我也沒有進行深究,這里就介紹一下伸縮、旋轉等變換的實現需要用到的2D變換相關的類.
WPF中的控件基本都是從FrameWorkElement繼承過來,因此都具有LayoutTransform和RenderTransform屬性,可以設置控件的這兩個屬性來對控件進行2D變換。在這里得注意一下LayoutTransform和RenderTransform的區別,它們之間的主要區別就是LayoutTransform在布局之前進而RenderTransform在布局之后。
(圖1LayoutTransform) (圖2 RenderTransform)
由圖1以及圖2可以看出兩者之間的差別LayoutTransform 在布局之前會進行旋轉的2D變換,因此下邊的button在布局計算位置時會在RolateButton的下方,而RenderTransform則由於在布局之后進行 因此RolateButton在進行旋轉的2D變換后並不會導致下方的按鈕下移。
表1 (2D變換類)
按指定的 Angle 旋轉元素。 |
|
ScaleTransform |
按指定的 ScaleX 和 ScaleY 量按比例縮放元素。 |
TranslateTransform |
按指定的 X 和 Y 量移動(平移)元素。 |
以上三種變換是比較常用的變換 分別對應旋轉、縮放以及移動控件;
若在對某個控件同時使用多個2D變換時可以設置控件的LayoutTransform或RenderTransform屬性為TransformGroup類的實例。
總結:對WPF控件進行移動,拉伸以及旋轉操作使用到的知識進行了一個簡單的介紹,具體實現可以參考Demo源碼,改源碼為本人以前在網上下載的一個小例子,基本實現了以上功能。由於時間關系就沒有從頭再實現一遍,若對代碼或是文章有啥意見非常歡迎相互交流。