• 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编写 如需要源码点击 https://files.cnblogs.com/chengxingliang/SLDoubleClick.rar 下载。
  • 相关阅读:
    springMVC静态资源
    MyBatis Generator
    使用springMVC时的web.xml配置文件
    Semaphore
    spring注解驱动--组件注册
    第1章 初始Docker容器
    docker面试整理
    第5章 运输层
    验证码
    带进度条的上传
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/1962374.html
Copyright © 2020-2023  润新知