本文示例源代码或素材下载
也许是因为Silverlight是跑在浏览器上的缘故,也许是Silverlight才刚刚起步,从设计之初到现在,它对鼠标事件的响应,仍然只有可怜的MouseLeftButtonDown、MouseLeftButtonUp、MouseEnter、MouseLeave和MouseMove五个事件而已。且不论它并没有对右键和滚轮(这个也许是为了跨平台,据说MacOS是没有滚轮的)的支持,就连双击这个简单的事件它也没有包装。因此,我自己写了一个Helper,实现了在Silverlight中的双击事件。
我仔细的研究了WinForm中的双击事件,我发现WinForm中的事件还真是多,和点击有关的事件,就有MouseClick、MouseDown、MouseUp、MouseDoubleClick、Click、DoubleClick等等。。。其实可以毫不客气的说,所有的事件都是对MouseDown和MouseUp的封装,但是这样的确可以让开发人员感到非常的方便。经过研究我发现,如果用户双击某一个控件,第一次点击会触发Click事件,第二次点击会触发DoubleClick而Click不会触发,同时这两次点击,都会触发MouseDown事件。
那么,我在Silverlight上的模拟,至少要达到这个要求。但是考虑到Silverlight上鼠标事件较少,又没有对右键的支持,因此我决定将情况分成两种,一种是双击的第一次会触发单击事件,另一种是双击后,两次点击都不会触发单击事件。我想,后一种也是有一定需求的,比如我做了一个MediaPlayer,我双击是为了全屏观看,单击是为了控制播放、暂停,这时如果双击的时候也触发了单击事件,那么全屏之后就暂停了,那多不爽啊。
其实通过监视MouseLeftButtonDown事件,可以很简单的模拟双击事件,只需要不停记录点击的时间,并且和上一次点击的时间比较,如果时间差小于某一个值,则触发双击事件,某则触发发单击事件。这样做,能够实现WinForm那种单双击的机制,但是无法实现我说的第二种机制,即双击的时候,单击永远不会触发。为了实现这个功能,我加入了一个Timer,当确定无法实现双击的时候,我会通过它来触发单击,这样做会造成单击事件触发有一定的延迟,但是这一点延迟也是微不足道的,毕竟双击的两次点击间隔也不是很长。该类的核心实现代码如下:
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!