2

当用户手动移动地图时,我想评估一些标准,并在完成时选择做一些事情。我似乎无法为此找到正确的MapControl 事件

我试过使用CenterChanged,但它会在地图移动时不断触发并降低性能。

我可以使用哪个MapControl事件来了解用户何时完成移动地图?

4

3 回答 3

3

我知道我已经晚了大约一年,但万一有人遇到这个问题......我很确定这样做的正确方法是听LoadingStatusChanged事件,然后在你回来时采取行动MapLoadingStatus.Loaded

public void LoadingStatusChangedEventHandler(MapControl sender, Object o)
{
    if (sender.LoadingStatus == MapLoadingStatus.Loaded)
    {
        // The map has stopped moving and finished rendering
        DoSomething();
    }
}

我知道那个事件的文档不是很好,但是在这个代码示例中有更多信息,你可以在git repo上找到更多信息。

于 2016-09-08T06:38:17.703 回答
1

我最终使用计时器每秒检查一次地图中心并相应地更新我的视图模型。对我来说这感觉像是一种 hack,但它比使用CenterChanged. DispatchTimer用于允许计时器在 UI 线程上运行,因此它可以访问MapControl.

DispatcherTimer mapCenterTimer = new DispatcherTimer();
mapCenterTimer.Tick += (object sender, object e) =>
{
  ViewModel.MapCenter = MyMapControl.Center;
};
mapCenterTimer.Interval = new TimeSpan(0, 0, 1); // fire every second
mapCenterTimer.Start();

如果 MapControl 为我们这些想要在用户完成移动地图时采取行动的人公开某种 ManualMoveComplete 事件,那肯定会很好。我在 uservoice 上创建了一个请求:https ://binglistens.uservoice.com/forums/283355-ideas/suggestions/9494889-add-a-centermanuallychanged-event-to-mapcontrol

于 2015-08-26T11:59:39.250 回答
-1

正如我同意你的观点,我更喜欢某种延迟事件,我也更喜欢详细的控件,而是自己过滤事件。从您的解决方案中,不是每秒触发一个定期计时器,而是在事件触发时重新启动它。当事件停止触发时,计时器将滴答作响,您将获得最终值:

DispatcherTimer mapCenterTimer = new DispatcherTimer();
mapCenterTimer.Tick += (object sender, object e) =>
{
  mapCenterTimer.Stop();
  ViewModel.MapCenter = MyMapControl.Center;
};
mapCenterTimer.Interval = TimeSpan.FromMilliseconds(500); // map idle for .5 seconds
MyMapControl.CenterChanged += (map, args) => { mapCenterTimer.Stop(); mapCenterTimer.Start(); };
于 2016-07-02T11:00:33.740 回答