4

在 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 的类型和精度不同。我更喜欢更简单、更简单的解决方案。*/

4

1 回答 1

1

我通过在调用 awaitable 之前设置一个 boolignoreNextViewportChanges并在异步操作完成后将其重置来解决了这个问题。trueTrySetViewAsyncfalse

在事件处理程序中,我立即打破常规然后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--;
}
于 2014-11-10T17:36:25.800 回答