MapControl различает смену пользователя или программного центра
В WinRt/WP 8.1 MapControl, как мне различить, когда пользователь изменил центр экрана, проводя по сравнению с программным изменением?
В WinRt / WP 8.1 MapControl есть событие CenterChanged ( http://msdn.microsoft.com/en-us/library/windows.ui.xaml.controls.maps.mapcontrol.centerchanged.aspx), но это не обеспечивает информация о том, что вызвало изменение центра.
Есть ли другой способ узнать, изменил ли пользователь центр карты?
/ * Чтобы дать больше контекста, мой конкретный сценарий выглядит следующим образом:
Учитывая приложение, которое показывает карту, я хочу отслеживать положение GPS пользователя.
- Если GPS-позиция найдена, я хочу поставить точку на карте и центрировать карту в этой точке.
- Если обнаружено изменение положения GPS, я хочу центрировать карту в этой точке.
- Если пользователь меняет положение карты касанием / проведением, я больше не хочу центрировать карту при изменении положения GPS.
Я мог бы взломать это, сравнив положение GPS и центр, но он позиционирует GPS положение LatLng другого типа и точности, как Map.Center LatLng. Я бы предпочел более простое, менее хакерское решение. * /
1 ответ
Я решил это, установив bool ignoreNextViewportChanges
в true
перед вызовом ожидаемого TrySetViewAsync
и сбросьте его до false
после выполнения асинхронного действия.
В обработчике событий я немедленно ломаю рутину ignoreNextViewportChanges
все еще верно.
В итоге это выглядит так:
bool ignoreNextViewportChanges;
public void HandleMapCenterChanged() {
Map.CenterChanged += (sender, args) => {
if(ignoreNextViewportChanges)
return;
//if you came here, the user has changed the location
//store this information somewhere and skip SetCenter next time
}
}
public async void SetCenter(BasicGeoposition center) {
ignoreNextViewportChanges = true;
await Map.TrySetViewAsync(new Geopoint(Center));
ignoreNextViewportChanges = false;
}
Если у вас есть случай, когда SetCenter может быть вызван дважды параллельно (так что последний вызов SetCenter
еще не закончена, но SetCenter
вызывается снова), вам может понадобиться использовать счетчик:
int viewportChangesInProgressCounter;
public void HandleMapCenterChanged() {
Map.CenterChanged += (sender, args) => {
if(viewportChangesInProgressCounter > 0)
return;
//if you came here, the user has changed the location
//store this information somewhere and skip SetCenter next time
}
}
public async void SetCenter(BasicGeoposition center) {
viewportChangesInProgressCounter++;
await Map.TrySetViewAsync(new Geopoint(Center));
viewportChangesInProgressCounter--;
}