[uwp]自定義Behavior之隨意拖動
阿新 • • 發佈:2018-11-06
原文:
[uwp]自定義Behavior之隨意拖動
由於最近有需求,所以自定義了一個隨意拖動元素的Behavior.
當然在使用這個自定義的Behavior時,有個小假設:拖動元素必須是Canvas容器的子元素。
實現原理比較簡單低效:
監聽被拖動元素的PointerMoved事件,當事件觸發的時候,獲取當前的指標資訊,判斷是否處於滑鼠左鍵按下狀態(Properties.IsLeftButtonPressed,在觸控式螢幕上,手指移動時,該屬性也為真),如果為真,就執行改變元素位置的程式碼,否則不做處理。
原理大致如上。
鑑於比較簡單,直接上程式碼
public class DragBehavior : DependencyObject, IBehavior { private bool isTap = false; private FrameworkElement element; private Canvas surface; public DependencyObject AssociatedObject { get { throw newNotImplementedException(); } } public void Attach(DependencyObject associatedObject) { element = associatedObject as FrameworkElement; element.PointerMoved += Element_PointerMoved; }private void Element_PointerMoved(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) { var point=e.GetCurrentPoint((UIElement)sender); if (point.Properties.IsLeftButtonPressed) { var pos = point.Position; pos.X = pos.X - element.ActualWidth / 2.0; pos.Y = pos.Y - element.ActualHeight / 2.0; var left = (double)element.GetValue(Canvas.LeftProperty); var top = (double)element.GetValue(Canvas.TopProperty); element.SetValue(Canvas.LeftProperty, left + pos.X); element.SetValue(Canvas.TopProperty, top + pos.Y); } } public void Detach() { if (element != null) { element.PointerMoved -= Element_PointerMoved; } } }
有必要解釋的是,pos是相對於被拖動元素自身的位置偏移,而並不是相對於容器的偏移量。
var pos = point.Position; pos.X = pos.X - element.ActualWidth / 2.0; pos.Y = pos.Y - element.ActualHeight / 2.0
這兩句目的在於,使指標位於元素中心,預設否則指標會在元素左上角處,比較難看。
最後就是如同普通的Behavior一樣,附加到元素上就可以,不過元素一定要是Canvas容器的子元素,並且該元素繼承自FrameworkElement(一般多從這兒繼承)。
以上程式碼便是全部。使用時記著要新增Behaviors SDK的引用。