2015-06-18 51 views
4

我正在構建需要用於呈現地理地圖的工具的應用程序,此外,應用程序還需要該工具來提供添加自定義覆蓋的方法。GMap.Net中的覆蓋Wpf

我發現GMap.Net是一個很好的工具。

我發現了很多在網絡上WinForm實例創建自定義疊加,例如:

GMapOverlay markersOverlay = new GMapOverlay("markers"); 
GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(-25.966688, 32.580528), GMarkerGoogleType.green); 
markersOverlay.Markers.Add(marker); 
gmap.Overlays.Add(markersOverlay); 

但是,當我走近的WPF版本GMap.Net我注意到,覆蓋都走了,我被迫將標記直接添加到標記集合(mymap.Markers.Add(new Marker())),而無法在單獨的疊加層中合成標記。

如何在GMap.Net的Wpf版本中使用疊加層?

+0

您應該在[討論頁](https://greatmaps.codeplex.com/discussions/topics/4903/wpf)上提問。 – Clemens

+0

這是相應的[線程](https://greatmaps.codeplex.com/discussions/640141) – rdoubleui

+1

是的,這就是我 – Matan

回答

5

解決方案是自己實現重疊集合。將一組共享相同ZIndex的標記保留爲一個疊加層和一個包含所有疊加層的集合。

我希望它就像在WinFrom版本。

+1

對不起,以喚醒舊線程。我也在閱讀同一個例子,並想知道兩件事。其中一個是你問的,另一個問題是如何使用'GMarkerGoogleType'枚舉?我認爲如果我可以直接從API獲取標記,而不是自己繪製標記或從其他地方下載圖像,那將會很好。 – Jai

0

爲了更好地理解(GMapMarker) marker,讓我們來看看它們是如何被添加的 。

的標記被設置的(UIElement) Shape,傳遞

  • MainWindow實例
  • 座標(A.O。)
  • 的ToolTipText

(UserControl) CustomMarkerDemo的構造

// add marker 
private void addMarker_Click(object sender, RoutedEventArgs e) 
{ 
    GMapMarker marker = new GMapMarker(currentMarker.Position); 
    { 
     ... // ToolTipText fetching logic 

     marker.Shape = new CustomMarkerDemo(this, marker, ToolTipText); 
     marker.ZIndex = combobox.SelectedIndex; 
    } 
    MainMap.Markers.Add(marker); 
} 

the demo我用ComboBoxSelectedIndex來設置新標記的ZIndex。正如你可以看到標記被添加到(ObservableCollection) MainMap.Markers。當我們不需要時,很容易刪除/過濾集合中的標記。這種方法的問題是,當從視圖中刪除(UIElement) Shape時,它們被丟棄並需要重建。這會導致不受歡迎的行爲,特別是如果您希望能夠一次顯示所有疊加層。

取而代之,我選擇僅向集合添加標記(通過用戶交互),並基於當前的combobox.SelectedIndex設置ShapeVisibility

// change overlays 
private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ComboBox combobox = sender as ComboBox; 
    if (combobox != null && MainMap != null) 
    { 
     // show all overlays 
     if (combobox.SelectedIndex == combobox.Items.Count - 1) 
     { 
      foreach (GMapMarker marker in MainMap.Markers) 
       marker.Shape.Visibility = Visibility.Visible; 
     } 
     // show only selected overlay 
     else 
     { 
      foreach (GMapMarker marker in MainMap.Markers) 
      { 
       if (marker.ZIndex == combobox.SelectedIndex) 
        marker.Shape.Visibility = Visibility.Visible; 
       else 
        marker.Shape.Visibility = Visibility.Collapsed; 
      } 
     } 
     currentMarker.Shape.Visibility = Visibility.Visible; 
    } 
} 

我鏈接了一個只有裸露的骨骼的設置,請注意這些庫中有更多的功能。