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 的方式使用它(例如,在项目模板中定义自定义标记)。
项目: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 的方式使用它(例如,在项目模板中定义自定义标记)。