我正在构建一个应用程序,它需要一个渲染地理地图的工具,此外,应用程序还需要该工具来提供一种添加自定义覆盖的方法。
我发现GMap.Net是这份工作的好工具。
我在web上找到了许多创建自定义覆盖的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版本中使用覆盖?
发布于 2015-07-24 13:56:49
解决方案是自己实现一个覆盖集合。保存一个标记集合,这些标记与一个覆盖共享相同的ZIndex,并保存一个包含所有覆盖的集合。
我希望它能像WinFrom版本那样。
发布于 2017-03-11 09:50:25
为了更好地理解(GMapMarker) marker,让我们看看它们是如何添加的。
标记的(UIElement) Shape被设置,传递
MainWindow实例到(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);
}在演示中,我使用ComboBox's SelectedIndex来设置新标记的ZIndex。正如您可以看到的那样,标记被添加到(ObservableCollection) MainMap.Markers中。当我们不需要标记时,很容易删除/过滤集合中的标记。这种方法的问题是,当(UIElement) Shape从视图中移除时,它们就会被处理并需要重建。这会导致不想要的行为,特别是如果您希望能够同时显示所有的覆盖。
相反,我选择只向集合添加标记(通过用户交互),并根据当前的Visibility设置Shape的combobox.SelectedIndex。
// 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;
}
}我把一个设置和基本的骨架连接起来,注意到这些库中有更多的功能。
https://stackoverflow.com/questions/30922211
复制相似问题