Windows8应用程序XAML/C#:在一个方法中为Bing映射设置多个图钉

本文关键字:Bing 方法 映射 设置 一个 XAML 应用程序 Windows8 | 更新日期: 2023-09-27 17:59:47

我正在努力添加一个纬度&经度作为Bing地图上的Pushpin,在使用XAML的Windows8应用程序中;C#。

使用事件处理程序(如右键点击地图)逐个添加Pushpin效果良好。

这是XAML:

 <bm:Map x:Name="myMap" Grid.Row="0" MapType="Road" ZoomLevel="14" Credentials="{StaticResource BingMapAPIKey}" ShowTraffic="False" Tapped="map_Tapped" >
      <bm:Map.Center>
            <bm:Location Latitude="-37.812751" Longitude="144.968204" />
      </bm:Map.Center>
 </bm:Map>

这里是处理程序:

    private void map_Tapped(object sender, TappedRoutedEventArgs e)
    {
        // Retrieves the click location
        var pos = e.GetPosition(myMap);
        Bing.Maps.Location location;
        if (myMap.TryPixelToLocation(pos, out location))
        {
            // Place Pushpin on the Map
            Pushpin pushpin = new Pushpin();
            pushpin.RightTapped += pushpin_RightTapped;
            MapLayer.SetPosition(pushpin, location);
            myMap.Children.Add(pushpin);
            // Center the map on the clicked location
            myMap.SetView(location);
        }
    }

以上所有工作。如果我点击地图,就会添加一个新的Pushpin。

现在,当我试图通过迭代列表来初始化页面时添加图钉时,地图上只显示列表的最后一个图钉,就好像每个新的图钉都覆盖了前一个一样。这是我使用的代码:

 protected override async void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
 {
      ...
      // The Venue class is a custom class, the Latitude & Logitude are of type Double
      foreach (Venue venue _venues)
      {
           Bing.Maps.Location location = new Location(venue.Latitude, venue.Longitude);
           // Place Pushpin on the Map
           Pushpin pushpin = new Pushpin();
           pushpin.RightTapped += pushpin_RightTapped;
           MapLayer.SetPosition(pushpin, location);
           myMap.Children.Add(pushpin);
           // Center the map on the clicked location
           myMap.SetView(location);
      }
      ...
 }

正如您所看到的,我使用了相同的代码,但在LoadState方法的末尾,地图只显示最后一个位置。如果您想知道,foreach循环将针对每个位置完全执行。

有没有什么方法可以实现这一点,或者更好的方法是,将地图子对象直接绑定到一个ObservableCollection的Pushpin对象?我觉得我离得很近,但我不知道我错过了什么。

请帮忙!

Windows8应用程序XAML/C#:在一个方法中为Bing映射设置多个图钉

您应该在数组(或列表或更有效的LocationCollection)中保留不同的位置,并仅在循环遍历元素后调用SetView方法。

  LocationCollection locationCollection = new LocationCollection ();
  // The Venue class is a custom class, the Latitude & Logitude are of type Double
  foreach (Venue venue _venues)
  {
       Bing.Maps.Location location = new Location(venue.Latitude, venue.Longitude);
       // Place Pushpin on the Map
       Pushpin pushpin = new Pushpin();
       pushpin.RightTapped += pushpin_RightTapped;
       MapLayer.SetPosition(pushpin, location);
       myMap.Children.Add(pushpin);

       locationCollection.Append(location);
  }
  myMap.SetView(new LocationRect(locationCollection));