MapControl区分用户或程序中心更改

时间:2014-11-04 10:38:14

标签: windows-runtime winrt-xaml windows-phone-8.1 winrt-component

在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。我更喜欢更简单,更少hacky的解决方案。 * /

1 个答案:

答案 0 :(得分:1)

我通过在调用等待的ignoreNextViewportChanges之前将bool 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--;
}