11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击

简介:

  Silverlight中是没有鼠标左键双击事件的。在实际项目中,我们只能够模拟鼠标双击事件。其原理如下:控件接受到第一次单击事件,此时开始设置一 个计时器,在计时器的时间范围内收到第二次点击事件,那么执行双击事件应该执行的程序段。如果计时器在规定的时间范围内并未接收到第二次点击事件,那么执 行单击事件。

        一般情况下,windows默认的鼠标双击间隔在200毫秒以内,所以在程序中我们设置超时时间为200毫秒。

        首先我们贴出鼠标双击类的所有源代码,此代码是在网上查找到的,进行了一部分的修改。类的注释在源码中已经写明:

 

 
  1. using System; 
  2. using System.Threading; 
  3. using System.Windows; 
  4. using System.Windows.Input; 
  5. using System.Windows.Threading; 
  6.  
  7. namespace SLDoubleClick 
  8. public delegate void MouseLeftDoubleDownEventHandler(object sender, MouseButtonEventArgs e); 
  9.  
  10. /// <summary> 
  11. /// 定义了双击事件的类 
  12. /// </summary> 
  13. public class DoubleClick 
  14. /// <summary> 
  15. /// 双击事件定时器 
  16. /// </summary> 
  17. private DispatcherTimer doubleClickTimer; 
  18.  
  19. /// <summary> 
  20. /// 是否单击 
  21. /// </summary> 
  22. private bool isOnceClick; 
  23.  
  24. /// <summary> 
  25. /// 双击事件 
  26. /// </summary> 
  27. public MouseLeftDoubleDownEventHandler mouseLeftDoubleDown; 
  28.  
  29. /// <summary> 
  30. /// 拥有双击事件的UI 
  31. /// </summary> 
  32. private UIElement owner; 
  33.  
  34. /// <summary> 
  35. /// 实例化DoubleClick 
  36. /// </summary> 
  37. /// <param name="owner">具有双击事件的UI</param> 
  38. public DoubleClick(UIElement owner) 
  39. this.owner = owner; 
  40. this.bindEvent(); 
  41.  
  42. /// <summary> 
  43. /// 绑定事件 
  44. /// </summary> 
  45. private void bindEvent() 
  46. //初始化时设置控件左键单击时触发的鼠标点击事件 
  47. this.owner.MouseLeftButtonDown += (new MouseButtonEventHandler(this.owner_MouseLeftButtonDown)); 
  48. DispatcherTimer timer = new DispatcherTimer(); 
  49. //设置单击事件时间间隔 
  50. timer.Interval = (new TimeSpan(0, 0, 0, 0, 200)); 
  51. this.doubleClickTimer = timer; 
  52. //初始化时设置在200毫秒之内部调用此事件,如果超过200毫秒还没有得到第二次点击,则调用此事件 
  53. this.doubleClickTimer.Tick += (new EventHandler(this.doubleClickTimer_Tick)); 
  54. /// <summary> 
  55. /// 此事件在超过200毫秒未接收到第二次点击时触发。确定本次是单击事件。 
  56. /// </summary> 
  57. /// <param name="sender"></param> 
  58. /// <param name="e"></param> 
  59. private void doubleClickTimer_Tick(object sender, EventArgs e) 
  60. this.isOnceClick = false
  61. this.doubleClickTimer.Stop(); 
  62.  
  63. private void owner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
  64. if (!this.isOnceClick) 
  65. { //点击第一次之后开始计时,并且设置此时为单击一次 
  66. this.isOnceClick = true
  67. this.doubleClickTimer.Start(); 
  68. else 
  69. { //在200毫秒的时间间隔之内并且触发doubleClickTimer_Tick事件。则执行鼠标左键双击事件。 
  70. this.mouseLeftDoubleDown(sender, e); 

        上面一段源代码在项目中,可以直接拷贝创建不用修改它,也可以不必看它的运行原理。我们右键点击项目名称,然后“添加”-->“新建项”,新建一个名为Uc.xaml自定义控件类,Uc.xaml.cs代码如下:

 

 
  1. private DoubleClick MouseDoubleClick; 
  2.       private bool isDoubleClick; 
  3.       /// <summary> 
  4.       /// 是否允许双击 
  5.       /// </summary> 
  6.       public bool IsDoubleClick 
  7.       { 
  8.           get { return isDoubleClick; } 
  9.           set {  
  10.               isDoubleClick = value; 
  11.               if (isDoubleClick == true
  12.               { 
  13.                   MouseDoubleClick = new DoubleClick(this); 
  14.                   this.MouseDoubleClick.mouseLeftDoubleDown += new MouseLeftDoubleDownEventHandler(full_mouseLeftDoubleDown); 
  15.                   this.Cursor = Cursors.Hand;                 
  16.               } 
  17.               else 
  18.               {  
  19.                    
  20.               } 
  21.           } 
  22.       } 
  23.       private void full_mouseLeftDoubleDown(object sender, MouseButtonEventArgs e) 
  24.       { 
  25.           MessageBox.Show("你双击了此矩形框"); 
  26.       } 

         在自定义控件中自定义一个属性,然后设置属性为Ture是实例化DoubleClick类,为此类的mouseLeftDoubleDown事件加载事件 方法,在此方法中实现需要进行的双击操作。最后我们在MainPage.xaml.cs代码中编写以下代码即可创建可设置是否允许双击的自定义控件。

 
  1. Uc uc = new Uc(); 
  2.           uc.IsDoubleClick = true
  3.           this.LayoutRoot.Children.Add(uc); 

        本实例采用VS2010+Silverlight 4.0编写 如需要源码点击 http://files.cnblogs.com/chengxingliang/SLDoubleClick.rar 下载。


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

相关文章
|
前端开发 开发工具 数据库

热门文章

最新文章

下一篇
DataWorks