[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选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...
 
随机推荐
- 为什么重写equals后要重写hashCode
			
equals和hashCode的关系 要搞清楚题目中的问题就必须搞明白equals方法和hashCode方法分别是什么,和诞生的原因,当搞明白了这一点其实题目就不算是个问题了,下面我们来探讨分别探讨一 ...
 - C#实现图片文件到数据流再到图片文件的转换
			
//----引入必要的命名空间using System.IO;using System.Drawing.Imaging; //----代码部分----// private byte[] photo;/ ...
 - MVC-READ2
			
框架设计模式 契约式设计.元编程.元数据驱动设计.管道模型.远程代理模式.提供程序模型:
 - 每月IT摘录201806
			
一.技术 1.架构师的技术升级要点:用两个字来描述:集群,用三个字:分布式,再用多点的文字:把海量的流量和数据合理分摊到数量合适的机器上. 想明白这点,后面就能知道该学哪些了,比如流量分摊时得负载均衡 ...
 - ios 解决Wkwebview闪烁问题
			
// 网页闪烁问题 if ([self.webView.realWebView isKindOfClass:[WKWebView class]]) { ((WKWebView * ...
 - ADF控件ID变化引发JS无法定位控件的解决方法
			
原文地址:ADF控件ID变化引发JS无法定位控件的解决方法作者:Nicholas JSFF定义的控件ID到了客户端时往往会改变.例如在JSFF中的一个的ID为"ot1",但是当这个 ...
 - Golang之接口(interface)
			
Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...
 - C语言时间处理
			
一.简介 时间处理在编程中经常遇到,包括程序的运行时间和显示时间等.在标准C中, 日期和时间的处理包含在 time.h 的头文件中,需要使用日期和时间相关的类型的函数的话, 需要导入time.h. 二 ...
 - Luogu 5170 【模板】类欧几里得算法
			
原理不难但是写起来非常复杂的东西. 我觉得讲得非常好懂的博客. 传送门 我们设 $$f(a, b, c, n) = \sum_{i = 0}^{n}\left \lfloor \frac{ai + ...
 - IRC聊天指南
			
参考https://www.cnblogs.com/fzzl/archive/2011/12/26/2302637.html