如何在c#中定义事件的优先级?

时间:2014-01-27 13:56:28

标签: c# .net events windows-phone-8

我正在使用Map Control开发Windows Phone应用。地图控件包含CenterChangedZoomLevelChanged个事件。

当我更改map的zoom值时,会引发两个事件(因为中心也会更改)。 但是,当我更改ZoomLevelChanged值时,我只想使用zoom事件。

如果有多个事件可用,或者在CenterChanged被引发时关闭ZoomLevelChanged事件,如何设置事件的优先级?

任何解决方案/演示/链接对我都非常有帮助。

2 个答案:

答案 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}要正常处理的事件。