7.制作可拖动的自定义控件,获取拖拽后控件坐标

简介:

       在Silverlight中MouseDragElementBehavior拖动行为的对象添加了某一个元素之后,就可以让该元素可以被拖动。这个行为 极大的方便了程序员的UI体验效果制作。但是在项目中,我们拖动了一个UI元素之后,我们往往还需要记录下这个UI元素的拖动后的元素坐标位置,以保存起 来,让用户自定义的拖动元素下次打开的时候能够还原出来。在这里有一个问题,我们很难获得UI元素拖动后的X,Y坐标。经查询各方面资料以及实践之后得出 这篇文章。通过加载MouseDragElementBehavior行为对象的DragFinished事件(本事件在每拖动一个像素点完成移动之后触 发),在这个事件中我们MouseDragElementBehavior对象实例的X,Y属性可以得到当前UI元素的具体位置。

        首先我们在新项目中添加一个Silverlight 自定义控件名为Rec.xaml。其XAML代码如下:

 

 
  1. <Grid x:Name="LayoutRoot" Background="White"
  2.      <Rectangle x:Name="ti" Width="140" Height="140" RadiusX="5" RadiusY="5" Fill="Blue"></Rectangle> 
  3.      <sdk:Label Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="120" /> 
  4.  </Grid> 

       其次我们引入System.Windows.Interactivity.dll和Microsoft.Expression.Interactions.dll两个文件。

       在Rec.xaml.cs文件中我们需要引入:
using System.Windows.Interactivity;
using Microsoft.Expression.Interactivity;
using Microsoft.Expression.Interactivity.Layout;

       这个时候,我们就可以使用MouseDragElementBehavior和它的相关方法了。我们现在贴出Rec.xaml.cs的代码如下:

 

 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Net; 
  5. using System.Windows; 
  6. using System.Windows.Controls; 
  7. using System.Windows.Documents; 
  8. using System.Windows.Input; 
  9. using System.Windows.Media; 
  10. using System.Windows.Media.Animation; 
  11. using System.Windows.Shapes; 
  12. using System.Windows.Interactivity; 
  13. using Microsoft.Expression.Interactivity; 
  14. using Microsoft.Expression.Interactivity.Layout; 
  15.  
  16. namespace SLMoveRecAndToolTip 
  17. public partial class Rec : UserControl 
  18. public Rec() 
  19. InitializeComponent(); 
  20.  
  21. MouseDragElementBehavior dragBehavior = new MouseDragElementBehavior(); 
  22. private bool isDrag; 
  23. /// <summary> 
  24. /// 是否允许被拖拽和鼠标右键 
  25. /// </summary> 
  26. public bool IsDrag 
  27. get { return isDrag; } 
  28. set 
  29. isDrag = value; 
  30. if (isDrag == true
  31. dragBehavior.Attach(this);//将本对象加入到可以鼠标拖动的行为对象中去 
  32. dragBehavior.DragFinished += new MouseEventHandler(dragBehavior_DragFinished); 
  33. //在对象移动成功之后加载一个处理事件。 
  34. else if (isDrag == false
  35. try 
  36. //设置本控件移动行为取消,并且取消DragFinished处理事件 
  37. dragBehavior.Detach(); 
  38. dragBehavior.DragFinished -= new MouseEventHandler(dragBehavior_DragFinished); 
  39. catch 
  40.  
  41.  
  42. /// <summary> 
  43. /// 被拖动完成之后触发的事件 
  44. /// </summary> 
  45. /// <param name="sender"></param> 
  46. /// <param name="e"></param> 
  47. void dragBehavior_DragFinished(object sender, MouseEventArgs e) 
  48. MouseDragElementBehavior dragBehavior = sender as MouseDragElementBehavior; 
  49. this.Tag = dragBehavior.X + "|" + dragBehavior.Y; // this.Tag设置为相应的值 
  50. this.label1.Content = "X:" + dragBehavior.X + "---Y:" + dragBehavior.Y; 
  51. //设置鼠标拖动本控件之后,在label1中显示当前控件的坐标位置 

        相关的代码解释都在注释中,在这里我不再啰嗦。在MainPage.xaml.cs中我们只需要实例化这个对象,然后再设置这个对象的IsDrag属性为true,即可让此控件被拖动。如果为false,则此自定义控件不可再拖动。

        源代码如下:

 

 
  1. Rec rect = new Rec(); 
  2.            rect.HorizontalAlignment = HorizontalAlignment.Left
  3.            rect.VerticalAlignment = VerticalAlignment.Top
  4.            rect.IsDrag = true
  5.            this.LayoutRoot.Children.Add(rect); 

        本实例使用VS2010+Silverlight 4.0开发。源码请点击SLMoveRecAndToolTip.rar下载


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/821455


相关文章
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
958 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
4月前
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
105 2
|
Windows 容器
一款简单的缩放拖拽图片控件
本文介绍一个针对 .NET 桌面应用程序的独立图片缩放拖拽显示控件 [SQPhoto](https://www.nuget.org/packages/SQPhoto/)。
141 0
一款简单的缩放拖拽图片控件
QT 标题栏隐藏可拖拽
这个也是我网上找到了 为了方便,记录一下
111 0
WinForm 将被遮挡的控件显示到最前面
WinForm 将被遮挡的控件显示到最前面
664 0
|
程序员 开发工具 C语言
Qt编写自定义控件45-柱状标尺控件
一、前言 这个控件写了很久了,是最早期的一批控件中的一个,和温度计控件类似,都是垂直的进度条,可以设置不同的背景颜色,左侧的刻度也可以自由设定,还提供了动画效果,其实就是开启定时器慢慢的进度到设定的目标值,如果设定的值比当前值大,则递增,反之递减。
1092 0
Qt编写自定义控件28-颜色滑块面板
一、前言 相比于上一个颜色按钮面板,此控件就要难很多,颜色值有三种表示形式,除了程序员最常用的RGB以外,还有HSB和CMY方式。RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
887 0
|
前端开发 C# Windows
WPF之鼠标滑动切换图片
原文:WPF之鼠标滑动切换图片   在网上找了一会儿也没找到我想要的效果,还是自己动手,丰衣足食吧。   需求:当前面板中只显示一张图片,图片栏的下部有用来显示当前图片处于图片队列中的位置的圆球,并且点击下部栏内的圆球可以快速切换,附动画缓动效果。
1162 0
|
Web App开发 C# Windows
WPF图片浏览器(显示大图、小图等)
原文:WPF图片浏览器(显示大图、小图等) 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshubo1989/article/details/46784601 1.概述                最近利用WPF做了一个图片浏览器,能够将文件夹中的所有图片以小图的形式显示,并将选中的图片以512*512大小显示。
2494 0
|
C#
WPF无边框拖动、全屏、缩放
原文:WPF无边框拖动、全屏、缩放 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lwwl12/article/details/78059361 先看效果 无边框 设置WindowStyle=”None”,窗口无关闭及缩放按钮,但还有黑边;设置AllowsTransparency=”True”,黑边没有了。
1970 0