GMap.NET C# WFP:我可以将自定义 UserControl 添加到 GMapControl 叠加层中吗?

GMap.NET C# WFP: Can i add custom UserControl into GMapControl overlays?

项目:c#、wpf、.net4.0、Gmap.Net.Presentation1.7.1.

我有:

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

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

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

    /* Overrided and additional methods. */
}

并且,例如,我有一些自定义用户控件 class。

代码:

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

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

    /* Overrided and additional methods. */
}

Xaml:

<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);

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

有任何建议、提示或帮助吗?

P.S。如果我解决了这个问题,我会post这里。我想这对其他人很有帮助。

另外,在Whosebug等上发现了很多关于GMap的问题,到处都看到Overlayclass。

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

我的版本没有这个。我已经将内置标记覆盖到 GMap class 中。

gmap.Markers - ObservableCollection of the GMapMarkers.

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

更新 0:

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

我相信解决方案比您尝试过的更简单,您可以从 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;            
    }
}

此标记实例使您可以访问自己的 CustomerMarkerElement(项目中的 UserControl)中的 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 的方式使用它(例如,在项目模板中定义自定义标记)。