2014-01-27 22 views
1

我正在使用Map Control開發Windows Phone應用程序。地圖控件有CenterChangedZoomLevelChanged事件。如何在c#中定義事件的優先級?

當我更改map的zoom值時,兩個事件都會發生(因爲中心也會發生變化)。 但我想只使用ZoomLevelChanged事件,當我更改zoom值時。

如果有多個事件可用或如何在ZoomLevelChanged被引發時關閉CenterChanged事件,我該如何設置事件的優先級?

任何解決方案/演示/鏈接將對我非常有幫助。

+1

爲什麼你需要關閉它?你正在處理它嗎?如果不只是忽略它.. – Charleh

回答

3

您無法定義事件的優先級,也不能依賴事件的順序。

我不是一個Windows Phone的開發者,但是問自己:如果什麼有在同一時間的縮放變化作爲中心的變化?你需要處理這兩個事件,對吧?我會完成這項工作,然後使它適用於縮放中心變化時縮放變化的情況。

+0

約翰,謝謝!現在,我認爲這個問題更廣泛的 – ShevninAnton

+0

這種技術用於一般的觸摸屏操控,一拖和觸摸區分 - 通常你的閾值設置爲阻力,如果它是低於一定金額,你把它當作觸摸。 – Charleh

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處理程序已經調用了跳過,使後續CenterChanged事件被正常處理。