在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位置latLng是一个不同的类型&精度为Map.Center latLng。我更喜欢更简单,更少hacky的解决方案。 * /
答案 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--;
}