0

项目:c#、wpf、.net4.0、Gmap.Net.Presentation 1.7.1。

我有的:

我的自定义 MapControl 类继承自 GMap.NET.WindowsPresentation.GMapControl 类。

public sealed class MapControl : GMapControl
{
    /* Some special data. */

    public MapConrol()
        : base()
    {
        /* Some init actions. */
    }

    /* Overrided and additional methods. */
}

而且,例如,我有一些自定义的 UserControl 类。

代码:

public sealed partial class MapObjectMarkerUiControl : UserControl
{
    /* Some special data. */

    public MapObjectMarkerUiControl()
    {
        /* Some init actions. */
    }

    /* Overrided and additional methods. */
}

xml:

<UserControl x:Class="MapCustomControls.MapObjectMarkerUiControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             Width="40" Height="40" RenderTransformOrigin="0.5, 0.5">
    <Grid>
        <!-- Some visual controls: text, buttons, etc. -->
    </Grid>
</UserControl>

自定义用户控件示例:

在此处输入图像描述

我需要的:

有没有办法参考地理坐标将其添加到地图中?像这样的东西: gmap.AddCustomUserControl(UserControl customMarker, double latitude, double longitude);

可能我应该从其他类继承我的 UserControl 或实现一些允许将我的小部件添加到地图的 Gmap.NET 接口。

任何建议,提示,帮助?

PS如果我解决了这个问题,我会在这里发布。我想这对其他人会很有帮助。

另外,我在 StackOverflow 等上发现了很多关于 GMap 的问题,到处都看到了 Overlay 类。

GMapOverlay markersOverlay = new GMapOverlay("markers");
gmap.Overlays.Add(markersOverlay);

在我的版本中,我没有这个。我已经在 GMap 类中存在内置标记覆盖。

gmap.Markers - ObservableCollection of the GMapMarkers.

并且无法创建自己的叠加层并将其添加到 GMapControl 对象。

更新0:

我脑海中的第一个想法。例如,只需通过地图对象的 id 在地图上添加一些特殊标记的 GMapMarkers。GMapControl 的 OnRender() 找到屏幕上的所有标记,解析它们的 id 并在我的 wpf UserControls 上方绘制。但我希望 GMapControl 中有一些内部机制。

在此处输入图像描述

4

1 回答 1

2

我相信该解决方案比您尝试过的更容易,您可以从中获得GMapMarker,例如:

class CustomMarker: GMapMarker
{
    public string Description { get; set; }

    public CustomMarker(PointLatLng pos, string description)
            : base(pos)
    {
        Description = description;
        Shape = new CustomMarkerElement();

        ((CustomMarkerElement)Shape).lblDesc.Content = description;            
    }
}

此标记实例使您可以访问自己CustomerMarkerElementUserControl项目内)中的 UI 属性:

<UserControl x:Class="WpfApplication3.CustomMarkerElement"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Ellipse 
            Fill="DarkKhaki"
            Height="40"
            HorizontalAlignment="Left"
            VerticalAlignment="Top"
            Width="40" />

        <Label 
            x:Name="lblDesc"
            Content="TST" 
            Foreground="White" 
            FontWeight="Bold" 
            HorizontalAlignment="Left" 
            HorizontalContentAlignment="Center" 
            Margin="0,6"
            VerticalAlignment="Top"
            Width="40"/>

    </Grid>
</UserControl>

不利的一面是,afaik 无法以符合 MVVM 的方式进行此操作(例如,在项目模板中定义自定义标记)。

于 2016-03-01T09:30:52.563 回答