需求:
- 在当前的Command或者Tool下单击或者双击mapcontrol进行不同的响应;
- 单击添加元素;
- 双击判断是否有元素被选中
分析:
- 很明显核心的实现就是如何判断出当前是单击还是双击!
补充说明:
- 在AE中存在两个响应双击的事件,一个是控件MapControl中的OnDoubleClick,就是进行过微软DX包装过的,还有一个就是原生的继承自ITool接口的OnDblClick;虽然都是双击,前者有参数,而后者没有参数,根据需求与设计自己选择;这里我们选择前者,因为击位置需要根据参数判断。
- 在MapControl中如果同时存在OnMouseDown与OnDoubleClick事件的话,那么即使双击也一定会先进入到OnMouseDown事件中,然后再进入OnDoubleClick事件,然后结束不会再次进入到OnMouseDown事件。
实现:
既然需要判断单击还是双击且一定会进入单击,那么我们就需要给单击添加一个控制,当他进入单击了以后延后响应操作,等一会看看有没有双击操作发生,所以OnMouseDown需要一个时间控制器;
System.Timers.Timer timerClose = new System.Timers.Timer(500);//延后时间500ms
timerClose.Elapsed += timerClose_Elapsed;//延后时间到了之后执行的操作
timerClose.AutoReset = false;//只执行一次
timerClose.SynchronizingObject = this;//设置同步对象,这个很重要,否则会出现线程问题
timerClose.Enabled = true;//开始计时
关于时间控制器其实.Net是不止一个,System.Timers.Timer主要就是服务于Winform的,当然也有服务于web的,大家自行搜索~
这里Elapsed 事件中就是注册我们在时间到了以后会执行的函数,且这个函数无论我们是否执行了双击都会执行;
但是没关系,因为我们只需要在双击事件的开始就对类的全局变量进行赋值操作,那么在Elapsed 注册事件中进行判断就可以不进行单击的下一步操作了,而双击操作也会继续进行下去~