6

在页面的生命周期中是否存在应该调用Map.SetView()函数的特定时间?在我们的应用程序中,我们在各种地图对象上使用它,它似乎随机工作,有时完美,有时没有效果,但也不例外。

示例代码:

RouteMap.SetView(LocationRectangle.CreateBoundingRectangle(DirectionCoordinates));

其中 RouteMap 是映射组件,DirectionCoordinates 包含地图的开始/结束坐标。

我可以看到边界框正在正确创建,但即使加载相同的数据,地图的定位也并不总是受到影响。如果我添加一个断点,它似乎确实有效,所以我假设它与地图加载有关,但是将SetView()功能添加到Loaded事件有同样的问题。我们目前在页面Loaded事件中处理地图信息。

更新

我一直在测试更多并尽可能添加事件,我知道 MapLoaded 事件在 SetView 之前被调用。调用 SetView 后,它有时会工作而不是其他人。不会调用 ViewChanging 或 ViewChanged 事件。

4

7 回答 7

4

这显然不是最好的解决方案,但是当调用 Loaded 事件时一定有一些东西没有完全完成加载,这会阻止它完成。

我在 Map_Loaded 事件中添加了 100 毫秒的睡眠,它解决了我遇到的问题。

System.Threading.Thread.Sleep(500);

更新

100 毫秒对某些人不起作用,您可能想玩弄数字、200、500 等。这仍然是地图加载时间的一个非常短的延迟。我已就此与 Microsoft 联系,他们告诉我他们正在调查此问题,我们希望很快能得到他们的某种回应。

更新和编辑

请改用以下代码来防止 UI 挂起:

await Task.Delay(250);
于 2012-11-30T17:17:27.780 回答
3

ResolveCompleted我使用事件和布尔标志解决了这个问题。

private void Map_ResolveCompleted(object sender, MapResolveCompletedEventArgs e)
    {
        if (this.zoomReq)
        {
            this.zoomReq = false;
            if (this.locationList != null && this.locationList.Count > 0)
            {
                var viewRect = LocationRectangle.CreateBoundingRectangle(this.locationList);
                this.Map.SetView(viewRect);
            }
        }
    }   

在地图缩放之前有明显的停顿,但至少这似乎一直有效。该标志是必需的,因为ResolveCompleted每次地图移动时都会触发。

于 2014-12-12T14:38:19.540 回答
2

我在一个方法中构建了一个地图层(Microsoft.Phone.Maps.Controls.MapLayer)和设置视图(public void SetView(LocationRectangle boundingRectangle);async

public async Task CreateMap()
{
    map.Add(mapLayer);
    map.SetView(locationRectangle);
}

我正在做一些加载,这就是我使用async.

这只会设置一次视图,这是我第一次导航到页面。

解决方案是调度 set view 调用:

public async Task CreateMap()
{
    map.Add(mapLayer);
    Dispatcher.BeginInvoke(() =>
            {
                map.SetView(locationRectangle);
            });
}

希望有帮助。

于 2013-03-08T04:36:04.367 回答
0

Loaded 事件是 SetView() 的合适位置。您可以尝试在 OnNavigatedTo 方法中创建矩形。当我处理位置时,我总是在 OnNavigatedTo 中启动我的观察者,并在 _Loaded 中处理任何地图图层。

于 2012-11-27T23:16:15.420 回答
0

我有一个非常相似的问题。基本上 map 的 setview 将在第一次加载页面时工作(即在所有数据完成加载之后),但如果我离开页面并返回并且不需要重新加载所有数据,它就不起作用。在调试时,似乎我在完成加载之前为地图设置了信息。

所以我为解决这个挑战所做的是:

  1. 在 XAML 中 - 我为地图的 Loaded 事件添加了一个事件处理程序。示例:Loaded="myMap_Loaded"
  2. 在 myMap_Loaded 事件中,我只是调用了一个异步方法来等待数据加载然后映射它。
    例子:

private void myMap_Loaded(object sender, RoutedEventArgs e) { WaitAndLoadMap(); }

  1. 对 WaitAndLoadMap 方法进行编码以在加载地图之前等待数据完成加载。
private async void WaitAndLoadMap()
    {
        //Check if the data is loaded and if it is not - loop. 
        while (!App.NearbyLocationsViewModel.IsLocationDataLoaded)
            await Task.Delay(250);

        //Load the map content and set the mapview.
    }

它似乎正在工作。希望这对其他人有帮助。

于 2014-11-18T00:06:23.517 回答
0

我有这个问题MapAnimationKind.Linear但是因为MapAnimationKind.None它没有任何问题

map.SetView(LocationRectangle.CreateBoundingRectangle(...), MapAnimationKind.None);
于 2014-05-27T07:59:07.090 回答
0

我自己在这个问题上工作了一段时间。将大部分内容加载到页面的构造函数中并没有帮助。我尝试了这个技巧,System.Threading.Thread.Sleep(500)但效果远远超过 500 毫秒,这对我来说是不可接受的。对于某些人来说,它有助于触发ZoomLevelChanged事件并在其中设置视图。对于我自己,我使用了一个DispatcherTimer我使用SetView()并触发了一个“ViewChanging”事件来停止计时器。如果您使用动画,则差异很小。

于 2013-09-06T02:23:10.503 回答