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--;
}
Другие вопросы по тегам