GMAP.NET 在标记下方添加标签
GMAP.NET adding labels underneath markers
我刚开始使用 gmap.net,我一直在寻找在标记下添加标签的功能。我看到有工具提示,但我希望在我的标记下有一个固定的标签,只有一个词的描述。
我搜索了文档或其他答案,但找不到任何让我相信它没有实现的东西。如果有人能证实这一点,我将不胜感激。
您需要创建自己的自定义标记。
基于 GMapMarker and the derived GMarkerGoogle 的来源,我想出了这个简化的例子:
public class GmapMarkerWithLabel : GMapMarker, ISerializable
{
private Font font;
private GMarkerGoogle innerMarker;
public string Caption;
public GmapMarkerWithLabel(PointLatLng p, string caption, GMarkerGoogleType type)
: base(p)
{
font = new Font("Arial", 14);
innerMarker = new GMarkerGoogle(p, type);
Caption = caption;
}
public override void OnRender(Graphics g)
{
if (innerMarker != null)
{
innerMarker.OnRender(g);
}
g.DrawString(Caption, font, Brushes.Black, new PointF(0.0f, innerMarker.Size.Height));
}
public override void Dispose()
{
if(innerMarker != null)
{
innerMarker.Dispose();
innerMarker = null;
}
base.Dispose();
}
#region ISerializable Members
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
}
protected GmapMarkerWithLabel(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endregion
}
用法(假设一个名为 gm
的 GMap
实例):
GMapOverlay markerOverlay = new GMapOverlay("markers");
gm.Overlays.Add(markerOverlay);
var labelMarker = new GmapMarkerWithLabel(new PointLatLng(53.3, 9), "caption text", GMarkerGoogleType.blue);
markerOverlay.Markers.Add(labelMarker)
我会在这里回答,因为这是为 WPF GMAP.NET 库显示文本标记时弹出的第一个问题。使用 WPF 版本的库显示文本标记实际上比在 WinForms 中容易得多,或者至少比接受的答案要容易得多。
WPF中的GMapMarker
有一个UIElement
类型的Shape
属性,这意味着你可以提供一个System.Windows.Controls.TextBlock
对象来显示文本标记:
Markers.Add(new GMapMarker(new PointLatLng(latitude, longitude))
{
Shape = new System.Windows.Controls.TextBlock(new System.Windows.Documents.Run("Label"))
});
由于标记在给定位置显示形状的左上部分,您可以使用 GMapMarker.Offset
属性 根据其尺寸调整文本位置。例如,如果您希望文本水平居中于标记的位置:
var textBlock = new TextBlock(new Run("Label"));
textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
textBlock.Arrange(new Rect(textBlock.DesiredSize));
Markers.Add(new GMapMarker(new PointLatLng(request.Latitude, request.Longitude))
{
Offset = new Point(-textBlock.ActualWidth / 2, 0),
Shape = textBlock
});
获取 TextBlock
尺寸的解决方案很快取自 this question,因此如果您需要更准确的方法来获取块的尺寸以使用偏移量,我建议您开始从那里开始。
我刚开始使用 gmap.net,我一直在寻找在标记下添加标签的功能。我看到有工具提示,但我希望在我的标记下有一个固定的标签,只有一个词的描述。
我搜索了文档或其他答案,但找不到任何让我相信它没有实现的东西。如果有人能证实这一点,我将不胜感激。
您需要创建自己的自定义标记。
基于 GMapMarker and the derived GMarkerGoogle 的来源,我想出了这个简化的例子:
public class GmapMarkerWithLabel : GMapMarker, ISerializable
{
private Font font;
private GMarkerGoogle innerMarker;
public string Caption;
public GmapMarkerWithLabel(PointLatLng p, string caption, GMarkerGoogleType type)
: base(p)
{
font = new Font("Arial", 14);
innerMarker = new GMarkerGoogle(p, type);
Caption = caption;
}
public override void OnRender(Graphics g)
{
if (innerMarker != null)
{
innerMarker.OnRender(g);
}
g.DrawString(Caption, font, Brushes.Black, new PointF(0.0f, innerMarker.Size.Height));
}
public override void Dispose()
{
if(innerMarker != null)
{
innerMarker.Dispose();
innerMarker = null;
}
base.Dispose();
}
#region ISerializable Members
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
}
protected GmapMarkerWithLabel(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
#endregion
}
用法(假设一个名为 gm
的 GMap
实例):
GMapOverlay markerOverlay = new GMapOverlay("markers");
gm.Overlays.Add(markerOverlay);
var labelMarker = new GmapMarkerWithLabel(new PointLatLng(53.3, 9), "caption text", GMarkerGoogleType.blue);
markerOverlay.Markers.Add(labelMarker)
我会在这里回答,因为这是为 WPF GMAP.NET 库显示文本标记时弹出的第一个问题。使用 WPF 版本的库显示文本标记实际上比在 WinForms 中容易得多,或者至少比接受的答案要容易得多。
WPF中的GMapMarker
有一个UIElement
类型的Shape
属性,这意味着你可以提供一个System.Windows.Controls.TextBlock
对象来显示文本标记:
Markers.Add(new GMapMarker(new PointLatLng(latitude, longitude))
{
Shape = new System.Windows.Controls.TextBlock(new System.Windows.Documents.Run("Label"))
});
由于标记在给定位置显示形状的左上部分,您可以使用 GMapMarker.Offset
属性 根据其尺寸调整文本位置。例如,如果您希望文本水平居中于标记的位置:
var textBlock = new TextBlock(new Run("Label"));
textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
textBlock.Arrange(new Rect(textBlock.DesiredSize));
Markers.Add(new GMapMarker(new PointLatLng(request.Latitude, request.Longitude))
{
Offset = new Point(-textBlock.ActualWidth / 2, 0),
Shape = textBlock
});
获取 TextBlock
尺寸的解决方案很快取自 this question,因此如果您需要更准确的方法来获取块的尺寸以使用偏移量,我建议您开始从那里开始。