Windows Phone 8上的Map.SetView()

时间:2012-11-27 22:17:55

标签: c# maps windows-phone windows-phone-8

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

示例代码:

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

其中RouteMap是映射组件,DirectionCoordinates包含地图的起点/终点坐标。

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

更新

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

7 个答案:

答案 0 :(得分:4)

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

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

System.Threading.Thread.Sleep(500);

<强>更新

对于某些人来说,100毫秒不起作用,你可能想要使用数字,200,500等。这仍然是地图加载时间的非常短暂的延迟。我已经联系了微软,他们已经告诉我他们正在调查这个问题,我们希望很快能得到他们的某种回应。

更新和修改

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

await Task.Delay(250);

答案 1 :(得分: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

答案 2 :(得分:2)

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

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

我正在做一些加载,这就是我使用async的原因。

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

解决方案是分派设置视图调用:

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

希望有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我在这个问题上做了一些时间。将大部分内容加载到页面的构造函数中没有帮助。我尝试了System.Threading.Thread.Sleep(500)的技巧,但是它花了500多分钟才生效,这对我来说是不可接受的。对于某些人来说,它有助于触发ZoomLevelChanged事件并在其中设置视图。对于我自己,我使用DispatcherTimer我使用了SetView()并发出了一个`ViewChanging'事件来停止计时器。如果使用动画,差异非常小。

答案 5 :(得分:0)

MapAnimationKind.Linear我遇到了这个问题,但对于MapAnimationKind.None,它没有任何问题

map.SetView(LocationRectangle.CreateBoundingRectangle(...), MapAnimationKind.None);

答案 6 :(得分:0)

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

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

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

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

    1. 编写WaitAndLoadMap方法以在加载之前等待数据完成加载 地图。
    2. 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.
          }
      

      似乎工作正常。希望这有助于其他人。