7.制作可拖动的自定义控件,获取拖拽后控件坐标
2011-02-17 00:00
309 查看
在Silverlight中MouseDragElementBehavior拖动行为的对象添加了某一个元素之后,就可以让该元素可以被拖动。这个行为 极大的方便了程序员的UI体验效果制作。但是在项目中,我们拖动了一个UI元素之后,我们往往还需要记录下这个UI元素的拖动后的元素坐标位置,以保存起 来,让用户自定义的拖动元素下次打开的时候能够还原出来。在这里有一个问题,我们很难获得UI元素拖动后的X,Y坐标。经查询各方面资料以及实践之后得出 这篇文章。通过加载MouseDragElementBehavior行为对象的DragFinished事件(本事件在每拖动一个像素点完成移动之后触 发),在这个事件中我们MouseDragElementBehavior对象实例的X,Y属性可以得到当前UI元素的具体位置。
首先我们在新项目中添加一个Silverlight 自定义控件名为Rec.xaml。其XAML代码如下:
其次我们引入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的代码如下:
相关的代码解释都在注释中,在这里我不再啰嗦。在MainPage.xaml.cs中我们只需要实例化这个对象,然后再设置这个对象的IsDrag属性为true,即可让此控件被拖动。如果为false,则此自定义控件不可再拖动。
源代码如下:
本实例使用VS2010+Silverlight 4.0开发。源码请点击SLMoveRecAndToolTip.rar下载
首先我们在新项目中添加一个Silverlight 自定义控件名为Rec.xaml。其XAML代码如下:
<Grid x:Name="LayoutRoot" Background="White"> <Rectangle x:Name="ti" Width="140" Height="140" RadiusX="5" RadiusY="5" Fill="Blue"></Rectangle> <sdk:Label Height="28" HorizontalAlignment="Left" Name="label1" VerticalAlignment="Top" Width="120" /> </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的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Interactivity; using Microsoft.Expression.Interactivity; using Microsoft.Expression.Interactivity.Layout; namespace SLMoveRecAndToolTip { public partial class Rec : UserControl { public Rec() { InitializeComponent(); } MouseDragElementBehavior dragBehavior = new MouseDragElementBehavior(); private bool isDrag; /// <summary> /// 是否允许被拖拽和鼠标右键 /// </summary> public bool IsDrag { get { return isDrag; } set { isDrag = value; if (isDrag == true) { dragBehavior.Attach(this);//将本对象加入到可以鼠标拖动的行为对象中去 dragBehavior.DragFinished += new MouseEventHandler(dragBehavior_DragFinished); //在对象移动成功之后加载一个处理事件。 } else if (isDrag == false) { try { //设置本控件移动行为取消,并且取消DragFinished处理事件 dragBehavior.Detach(); dragBehavior.DragFinished -= new MouseEventHandler(dragBehavior_DragFinished); } catch { } } } } /// <summary> /// 被拖动完成之后触发的事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void dragBehavior_DragFinished(object sender, MouseEventArgs e) { MouseDragElementBehavior dragBehavior = sender as MouseDragElementBehavior; this.Tag = dragBehavior.X + "|" + dragBehavior.Y; // this.Tag设置为相应的值 this.label1.Content = "X:" + dragBehavior.X + "---Y:" + dragBehavior.Y; //设置鼠标拖动本控件之后,在label1中显示当前控件的坐标位置 } } }
相关的代码解释都在注释中,在这里我不再啰嗦。在MainPage.xaml.cs中我们只需要实例化这个对象,然后再设置这个对象的IsDrag属性为true,即可让此控件被拖动。如果为false,则此自定义控件不可再拖动。
源代码如下:
Rec rect = new Rec(); rect.HorizontalAlignment = HorizontalAlignment.Left; rect.VerticalAlignment = VerticalAlignment.Top; rect.IsDrag = true; this.LayoutRoot.Children.Add(rect);
本实例使用VS2010+Silverlight 4.0开发。源码请点击SLMoveRecAndToolTip.rar下载
相关文章推荐
- Silverlight实用窍门系列:7.制作可拖动的自定义控件,获取拖拽后控件坐标【实例源码下载】
- 在javacript中获取控件坐标
- Android 自定义地图控件 可手指拉伸放大缩小拖动,指定坐标加点加线
- Android 根据坐标获取控件方法
- Qt获取控件位置,坐标总结
- Monkeyrunner学习之任意节点控件获取及获取对应控件的相对坐标实现对控件的操作
- 鼠标移过获取控件句柄、类名、坐标
- 如何获取控件的坐标位置
- javascript 获取控件坐标
- Android 根据坐标获取控件方法
- Android 重写ScrollView控件,以至于上下拖动时获取正确的滚动位置
- 如何获取控件在窗体上的位置坐标和大小值
- 何时能获取Activity中控件的坐标
- android 获取控件在屏幕里的坐标
- 获取鼠标的坐标,获取控件的坐标
- 获取鼠标在Picture控件中的坐标,并显示到对话框的状态栏中
- android 获取屏幕宽高 和 获取控件坐标
- Android拖动,缩放,自定义内容,控件制作(可拖动缩放RelativeLayout定制)
- MFC 获取picture控件的鼠标点击坐标位置的方法
- asp.net 在后台给前台的控件设置Style属性与坐标,后台设置CSS样式,后台获取前台控件坐标