[uwp]自定义Behavior之随意拖动

简介: 原文:[uwp]自定义Behavior之随意拖动  由于最近有需求,所以自定义了一个随意拖动元素的Behavior.   当然在使用这个自定义的Behavior时,有个小假设:拖动元素必须是Canvas容器的子元素。
原文: [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的引用。

 

    

 

目录
相关文章
|
C# 数据安全/隐私保护
【WPF】右下角弹出自定义通知样式(Notification)——简单教程
原文:【WPF】右下角弹出自定义通知样式(Notification)——简单教程 1.先看效果 2.实现 1.主界面是MainWindow 上面就只摆放一个Button即可。
3051 0
Avalonia使用默认弹窗
Avalonia使用默认弹窗
198 0
Avalonia使用默认弹窗
|
API Windows 容器
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件(上)
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件
204 0
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件(上)
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件(下)
MFC应用程序——标签控件_IP控件_时间控件_List Control控件_Tree Control控件_命令按钮_列表框_组合框_图片_滚动控件
169 0
|
Web App开发 C# Windows
WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
原文:WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome) 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
1607 0
|
C#
自定义WPF 窗口样式
原文:自定义WPF 窗口样式 自定义 Window 在客户端程序中,经常需要用到自定义一个 Window ,大部分是为了好看吧。
1338 0
|
C#
WPF自定义行为Behavior,实现双击控件复制文本
原文:WPF自定义行为Behavior,实现双击控件复制文本 WPF引用xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.
1093 0
|
C# 开发工具 git
WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
原文:WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容 简介   在前面一篇文章里面,我们实现了AvalonDock选项卡的动态添加,但是对于选项卡里面的内容,我们并没有实现任何有用的功能。
1354 0
|
Go
UWP 拖拽文件
原文:UWP 拖拽文件 桌面环境下的UWP,加入拖拽模式还是会增加用户好感度的。 好了,先看一下我最新研发的【小微识花】吧,演示一下       炫酷,有没有, 而且这识别速度,也是杠杠的~~~    关于拖拽的实现,一般有两个方法。
968 0
|
Windows
背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
原文:背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 [源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIEle...
1151 0