我正在使用Map Control开发Windows Phone应用。地图控件包含CenterChanged
和ZoomLevelChanged
个事件。
当我更改map的zoom
值时,会引发两个事件(因为中心也会更改)。
但是,当我更改ZoomLevelChanged
值时,我只想使用zoom
事件。
如果有多个事件可用,或者在CenterChanged
被引发时关闭ZoomLevelChanged
事件,如何设置事件的优先级?
任何解决方案/演示/链接对我都非常有帮助。
答案 0 :(得分:3)
您无法定义事件的优先级,也不能依赖事件的顺序。
我不是Windows Phone开发人员,但问问自己:如果在大型中心更改的同时进行缩放更改会怎么样?你需要处理这两个事件,对吗?我会做那个工作,然后让它适用于变焦变化的情况,中心变化很小。
答案 1 :(得分:0)
“同时”发生的事件将添加到Dispatcher队列中。如果单个事件设置“缩放”然后设置“居中”,则队列将包含缩放事件,后跟中心事件。
通过定义优先级,我不完全确定你的意思。如果您的意思是更改事件处理程序的顺序,则执行此操作的唯一方法是修改设置两个属性的代码,以便以不同的顺序设置它们。将事件处理程序添加到队列后,您无法对它们重新排序。
如果您只想处理第一个“同步”事件,可以通过禁用其他处理程序直到队列结束来实现。像这样:
// in ZoomLevelChanged handler:
_zooming = true;
mapControl.Dispatcher.BeginInvoke(new Action(() => _zooming = false));
// in CenterChanged handler:
if (_zooming) return;
// rest of implementation
BeginInvoke将操作添加到队列末尾,因此_zooming
标志只会在调用并跳过立即CenterChanged
处理程序后重置,从而允许后续{{1}要正常处理的事件。