2014-01-27 4 views
1

Я разрабатываю приложение для Windows Phone, используя Map Control. Управление картой имеет CenterChanged и ZoomLevelChanged событий.Как определить приоритет для событий в C#?

Когда я изменяю значение zoom для карты, оба события поднимаются (потому что центр тоже меняется). Но я хочу использовать только событие ZoomLevelChanged, когда я изменяю значение zoom.

Как установить приоритет для событий, если доступно несколько событий или как отключить событие CenterChanged, когда вызывается ZoomLevelChanged?

Любое решение/демонстрация/ссылка были бы очень полезны для меня.

+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 события, которые будут обрабатываться в обычном режиме.

Смежные вопросы