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


相关文章
|
Web App开发 移动开发 JavaScript
基于Vue的极简生成器 — Vuepress
VuePress由两部分组成:一个极简的静态站点生成器,带有一个vue支持的主题系统和Plugin API,以及一个为编写技术文档而优化的默认主题。创建它是为了支持Vue自己的子项目的文档需求。
1748 0
基于Vue的极简生成器 — Vuepress
|
8月前
|
人工智能 数据可视化 数据处理
从0到1只需“拖一拖”,开发时间按秒算——低代码到底有多牛
低代码平台正颠覆传统软件开发模式,通过可视化开发、模块化组件和自动化工具,将复杂开发过程大大简化。开发者只需“拖拽”组件和配置参数,即可快速构建应用,无需复杂编程。低代码平台支持实时预览、自动代码生成和快速部署,极大提高了开发效率,满足多样化业务需求。其核心引擎(如SQL引擎、功能引擎等)的升级,进一步提升了性能与灵活性。此外,模型驱动开发、智能数据处理及AI融合,使得低代码平台不仅简化开发流程,还为企业提供高效、灵活的技术解决方案,推动企业数字化转型。未来,低代码将成为智能化开发的关键趋势。
346 18
|
机器学习/深度学习 存储 算法
Optuna发布 4.0 重大更新:多目标TPESampler自动化超参数优化速度提升显著
Optuna,广受欢迎的超参数优化框架,近日发布了其第四个主要版本。自2018年问世以来,Optuna迅速成为机器学习领域的关键工具,目前拥有10,000+ GitHub星标、每月300万+下载量、16,000+代码库使用、5,000+论文引用及18,000+ Kaggle使用。Optuna 4.0引入了OptunaHub平台,支持功能共享;正式推出Artifact Store管理生成文件;稳定支持NFS的JournalStorage实现分布式优化;显著加速多目标TPESampler,并引入新Terminator算法。
539 9
Optuna发布 4.0 重大更新:多目标TPESampler自动化超参数优化速度提升显著
|
11月前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
738 2
|
11月前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
401 0
|
数据采集 机器学习/深度学习 自然语言处理
ModelScope模型库体验之中文StructBERT系列预训练语言模型
StructBERT在BERT的基础上提出改进优化,通过在句子级别和词级别引入两个新的目标函数,打乱句子/词的顺序并使模型对其进行还原的方式,能让机器更好地掌握人类语法,加深对自然语言的理解,使得模型学习到更强的语言结构信息。
47594 0
ModelScope模型库体验之中文StructBERT系列预训练语言模型
|
人工智能 弹性计算 缓存
带你读《弹性计算技术指导及场景应用》——2. 技术改变AI发展:RDMA能优化吗?GDR性能提升方案
带你读《弹性计算技术指导及场景应用》——2. 技术改变AI发展:RDMA能优化吗?GDR性能提升方案
463 1
|
存储 JSON 数据库
从 MQTT、InfluxDB 将数据无缝接入 TDengine,接入功能与 Logstash 类似
利用 TDengine Enterprise 和 TDengine Cloud 的数据接入功能,我们现在能够将 MQTT、InfluxDB 中的数据通过规则无缝转换至 TDengine 中,由于该功能在实现及使用上与 Logstash 类似,本文将结合 Logstash 为大家进行解读。
414 1
|
SQL 存储 自然语言处理
ES 在舆情搜索中的实践- Elastic Stack 实战手册
网络舆情监测,主要是利用互联网信息采集技术,以及自然语言处理等智能信息处理技术,通过对互联网公开数据进行自动化抓取,然后对信息进行结构化、自动分类、文本聚类、主题发现与跟踪等,提供信息检索、多维度统计、敏感信息预警、信息简报、自动化报告等功能,帮助用户及时发现危害品牌形象的观点,并为用户分析关注对象在网络中的形象提供依据。
1373 0
ES 在舆情搜索中的实践- Elastic Stack 实战手册
Stream方法使用-peek和foreach方法讲解
Stream方法使用-peek和foreach方法讲解
579 0