1. 程式人生 > >[uwp]自定義Behavior之隨意拖動

[uwp]自定義Behavior之隨意拖動

原文: [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 new
NotImplementedException(); } } 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的引用。