Silverlight实用窍门系列:11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击【附带源码实例】-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

Silverlight实用窍门系列:11.Silverlight中为自定义控件添加鼠标双击属性,Silverlight模拟鼠标双击【附带源码实例】

简介:
+关注继续查看

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

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

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

复制代码

using System;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using System.Windows.Threading;

namespace SLDoubleClick
{
public delegate void MouseLeftDoubleDownEventHandler(object sender, MouseButtonEventArgs e);

/// <summary>
/// 定义了双击事件的类
/// </summary>
public class DoubleClick
{
/// <summary>
/// 双击事件定时器
/// </summary>
private DispatcherTimer doubleClickTimer;

/// <summary>
/// 是否单击
/// </summary>
private bool isOnceClick;

/// <summary>
/// 双击事件
/// </summary>
public MouseLeftDoubleDownEventHandler mouseLeftDoubleDown;

/// <summary>
/// 拥有双击事件的UI
/// </summary>
private UIElement owner;

/// <summary>
/// 实例化DoubleClick
/// </summary>
/// <param name="owner">具有双击事件的UI</param>
public DoubleClick(UIElement owner)
{
this.owner = owner;
this.bindEvent();
}

/// <summary>
/// 绑定事件
/// </summary>
private void bindEvent()
{
//初始化时设置控件左键单击时触发的鼠标点击事件
this.owner.MouseLeftButtonDown += (new MouseButtonEventHandler(this.owner_MouseLeftButtonDown));
DispatcherTimer timer
= new DispatcherTimer();
//设置单击事件时间间隔
timer.Interval = (new TimeSpan(0, 0, 0, 0, 200));
this.doubleClickTimer = timer;
//初始化时设置在200毫秒之内部调用此事件,如果超过200毫秒还没有得到第二次点击,则调用此事件
this.doubleClickTimer.Tick += (new EventHandler(this.doubleClickTimer_Tick));
}
/// <summary>
/// 此事件在超过200毫秒未接收到第二次点击时触发。确定本次是单击事件。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void doubleClickTimer_Tick(object sender, EventArgs e)
{
this.isOnceClick = false;
this.doubleClickTimer.Stop();
}

private void owner_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!this.isOnceClick)
{
//点击第一次之后开始计时,并且设置此时为单击一次
this.isOnceClick = true;
this.doubleClickTimer.Start();
}
else
{
//在200毫秒的时间间隔之内并且触发doubleClickTimer_Tick事件。则执行鼠标左键双击事件。
this.mouseLeftDoubleDown(sender, e);
}
}
}
}
复制代码

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

复制代码

private DoubleClick MouseDoubleClick;
private bool isDoubleClick;
/// <summary>
/// 是否允许双击
/// </summary>
public bool IsDoubleClick
{
get { return isDoubleClick; }
set {
isDoubleClick
= value;
if (isDoubleClick == true)
{
MouseDoubleClick
= new DoubleClick(this);
this.MouseDoubleClick.mouseLeftDoubleDown += new MouseLeftDoubleDownEventHandler(full_mouseLeftDoubleDown);
this.Cursor = Cursors.Hand;
}
else
{

}
}
}
private void full_mouseLeftDoubleDown(object sender, MouseButtonEventArgs e)
{
MessageBox.Show(
"你双击了此矩形框");
}
复制代码

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


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

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




    本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/02/23/1962374.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
关于自定义控件设计时如何把属性写入aspx中的研究(上)
如何通过继承GridView来修改在设计时绑定数据源时自动生成的ASP.Net代码? 具体情况是这样的,ObjectDataSource绑定到实体类,GridView帮定到ObjectDataSource,这时候,GridView会获取实体类的构架信息,并自动生成一些列,HeaderText就是实体类的属性名,是E文的,我现在想在GridView的CreateColumns方法中进行拦截这个生成过程,硬是把E文改为对应的中文。
627 0
js关于为DOM对象添加自定义属性的方式和区别
DOM对象的三种在添加自定义属性的方式 一是 通过 “.”+“属性名”      二是 setAttribute()(getAttribute()获取) 三是 直接在元素标签上加属性  如:     三者的区别主要是在获取属性值方面:    1.var e = document.getElementById("te");   2.//获取属性   3.//用 . 来引用,必须是内置的(IE 可以访问自定义属性),而且引用的时候,区分大小写。
1149 0
css3 box-sizing属性
个人总结: 如果需要兼容IE6 IE7,使用content-box。现在流行bootstrap3,需注意它使用的是border-box。   box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box。
728 0
为Web控件添加客户端属性
首先在.aspx页面中写好javascript函数,例如enterevent(button) 然后用下面的语句为TextBox添加属性,实现当onkeypress事件触发时执行enterevent(button)函数 txtSeaCon.
594 0
WPF整理-为控件添加自定义附加属性
原文:WPF整理-为控件添加自定义附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性。举个最常见的例子 需要说明的是并不是所有的附加属性都是元素放进去后才会有附加效果,上面的例子只是刚好是这种错觉的巧合情况,Grid.Row也属于这种巧合。
1239 0
C# 自定义属性在propertyGrid控件中显示
在上篇文章(地址: C# 设计时动态改变实体在PropertyGrid中显示出来的属性)中可以看到: 自定义属性的显示是有问题的,那么如何修改呢? 代码如下: public class PropertyDisplayConverterr&lt;T&gt; : ExpandableObjectConverter where T : IDisplay { public
2678 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载