[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的引用。
[uwp]自定义Behavior之随意拖动的更多相关文章
- [uwp]自定义图形裁切控件
开始之前,先上一张美图.图中的花叫什么,我已经忘了,或者说从来就不知道,总之谓之曰“野花”.只记得花很美,很香,春夏时节,漫山遍野全是她.这大概是七八年前的记忆了,不过她依旧会很准时的在山上沐浴春光, ...
- CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
1.先添加几个RPM下载源 1.1)安装RPMforge的CentOS6源 [root@AY130611215205Z ~]# wget -c http://pkgs.repoforge.or ...
- Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具) 最近因为项目关系,收朋友之托,想制作秀场网站,但是因为之前一直没有涉及到这 ...
- IIS6/IIS7环境下实现支持mp4视频随意拖动、预览播放、边下载边播放
前几天,一客户需要在IIS环境下实现MP4视频可以随意拖动观看,边下载边播放.一看这要求,IIS本身是无法实现,想着应该需要用插件,于是GG一番,还真找到这样的插件,此组件为H264-Streamin ...
- 自定义Behavior 实现Listbox自动滚动到选中项
原文:自定义Behavior 实现Listbox自动滚动到选中项 blend为我们提供方便的behavior来扩展我们的控件,写好之后就可以在blend中方便的使用了. 下面是自定义的behavior ...
- 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...
- xamarin UWP自定义圆角按钮
uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...
- CoordinatorLayout 自定义Behavior并不难,由简到难手把手带你飞
先来看看最终的效果~~ 本文同步至博主的私人博客wing的地方酒馆 嗯..一个是头像上移的 另一个是模仿UC浏览器的. (PД`q.)你不是说!有三款的吗,怎么只有两款!!!! 不要急嘛... 说了从 ...
- UWP自定义RadioButton实现Tab底部导航
先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...
随机推荐
- 778. Swim in Rising Water
▶ 给定方阵 grid,其元素的值为 D0n-1,代表网格中该点处的高度.现在网格中开始积水,时刻 t 的时候所有值不大于 t 的格点被水淹没,当两个相邻格点(上下左右四个方向)的值都不超过 t 的时 ...
- python新里程
为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...
- 通过 NPOI 生成 Excel
HSSFWorkbook hssfworkbook; ISheet sheet1; public void BuildExcel() { hssfworkbook = new HSSFWorkbook ...
- Visual Basic 函数速查
Calendar 常数 可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbCalGreg 0 指出使用的是阳历. vbCalHijri 1 指出使用的是伊斯兰历法. Color 常数 可 ...
- CHEMISTS DISCOVER A SAFE, GREEN METHOD TO PROCESS RED PHOSPHORUS
When it comes to making phosphorus compounds, chemists have traditionally relied on w ...
- iOS下nil 、NULL、 Nil 、NSNull的区别
1.nil,定义一个空的实例,指向OC中对象的空指针. 示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = ...
- 32-python代码打包成exe文件-pyinstaller
安装 pyinstaller: pip install pyinstall 简单使用 最简单的使用方式是运行 pyinstaller myscript.py 来生成可执行文件,其中 myscript. ...
- c语言寄存器变量
寄存器存在于CPU内部,运算速度非常快, 因为内存中的数据必须载入寄存器才能计算.如果直接定义一个变量为寄存器变量,则少了载入等过程自然会快.对于频繁使用的变量可以把它放在寄存器中来提速度. 对于VC ...
- sqlserver2014新特性
1.SQL Server 2014新特性探秘(1)-内存数据库 在传统的数据库表中,由于磁盘的物理结构限制,表和索引的结构为B-Tree,这就使得该类索引在大并发的OLTP环境中显得非常乏力,虽然有很 ...
- 此实现不是Windows平台FIPS验证的加密算法的一部分
运行wpf程序,出现错误“此实现不是Windows平台FIPS验证的加密算法的一部分”. 解决方法: 1.在window中打开功能里输入regedit,回车打开注册器: 2.进入如下路径中 HKEY_ ...