博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[uwp]自定义Behavior之随意拖动
阅读量:6205 次
发布时间:2019-06-21

本文共 2032 字,大约阅读时间需要 6 分钟。

原文:

  由于最近有需求,所以自定义了一个随意拖动元素的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的引用。

 

    

 

转载地址:http://hdqca.baihongyu.com/

你可能感兴趣的文章
WPR-007:WPF中窗体的透明设置
查看>>
error: Refusing toundefine while domain managed save image exists
查看>>
wordpress在新窗口打开留言者链接
查看>>
DataUml Design 介绍8-DataUML 1.2版本正式发布
查看>>
第四章 C++数据类型
查看>>
我的友情链接
查看>>
mysql主从复制
查看>>
Linux下压缩某个文件夹(文件夹打包)
查看>>
理解Lucene/Solr的缓存
查看>>
java开发过程中的命名规范
查看>>
在Linux上启动oracle 11g OEM
查看>>
【原创】吟端午
查看>>
一夜暴富之前的漫漫长路
查看>>
Yii Zii.widgets.Cmenu 操作
查看>>
win 下 apache2.4 +tomcat7 集群
查看>>
angualejs
查看>>
关于工作的选择之软件开发还是软件维护的建议
查看>>
记录每个用户的操作记录(命令)
查看>>
五年后存储会是什么样子
查看>>
sersync+rsync实现实时同步
查看>>