出处来源于博客园 作者张子浩 原文地址https://www.cnblogs.com/ZaraNet/p/12766143.html,如有转载,请联系我,如无经过作者同意,作者有权申请法律保护。

  前一段时间说过一篇绘制极坐标的,这段时间对它进行了改造已经今非昔比了,功能实现了很多,我目的是让Marker动起来,然后还会绘制Route,上篇也就是简单的绘制了Route,没有关于Marker的相关知识。

  那个Circle有一定的改造,原来的纯色改成了渐变,这个你可以提前想好,不过在代码中你要做好适配,将 System.draw.color  转换成了 Media.Color ,取其中的ARGB值。

public Circle(string name, int radius,string[] vs)
{
Radius = radius;
m_viewModelCircle = new ViewModelCircle();
m_viewModelCircle.CircleDis = name;
this.DataContext = m_viewModelCircle;
InitializeComponent(); //控制circle RadialGradientBrush radialGradient = new RadialGradientBrush();
var obj = ColorTranslator.FromHtml(vs[]);
var ob2 = ColorTranslator.FromHtml(vs[]);
var ob3 = ColorTranslator.FromHtml(vs[]);
this.circle.Stroke= new SolidColorBrush(System.Windows.Media.Color.FromArgb(ob3.A, ob3.R, ob3.G, ob3.B));
radialGradient.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromArgb(obj.A, obj.R, obj.G, obj.B), 0.75));
radialGradient.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromArgb(ob2.A, ob2.R, ob2.G, ob2.B), ));
this.circle.Fill = radialGradient;
}

  我们都知道在Wpf的Gmap.net中没有了GMapOverlay 概念,所有的东西都在Marker中操作,这样其实有一个优点,就是把Overlay和Marker混合在一起更好管理,你可以通过Tag来寻找你对象,非常轻便,但设计者不是这么认为的,可能是某些原理没法走通。

  最基本的右击在map中添加标点可以这么操作。

private void RadarMap_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
Point clickPoint = e.GetPosition(radarMap);
PointLatLng point = radarMap.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
id += ;
GMapMarker currentMarker = new GMapMarker(point);
{
currentMarker.Shape = new CustomMarker(id, currentMarker);
//(currentMarker.Shape as CustomMarker).SetContent(point, "1"); 这种方法可以触发SetContent
currentMarker.ZIndex = -;
currentMarker.Position = point;
radarMap.Markers.Add(currentMarker);
this.Focus();
}
}

  代码中可以发现我们可以轻松将gmap的marker shape属性 ,随后转换成原来的marker类型,轻松调用属于它的方法,所以它的生命周期是等待它所在gmap中的marker被销毁才会被dispose,至于我的标点数据是从那里接受的,我只是启用两个Demo而已,发了个udp通讯,一般来说都是使用结构体来接受,传入的Byte值,我们进行逆转。

 public static object BytesToStruct(byte[] buf, int len, Type type)
{
// int len = Marshal.SizeOf(buf);
object rtn;
IntPtr buffer = Marshal.AllocHGlobal(len);
Marshal.Copy(buf, , buffer, len);
rtn = Marshal.PtrToStructure(buffer, type);
Marshal.FreeHGlobal(buffer);
return rtn;
}

  下面的代码是关于绘制,以及判断marker是否存在,如果存在则修改Postion,而且还要重新绘制Route,每个Route是对应着它的Marker,所以需要一个字典,每次重新绘制的时候,先将Route全部删除,随后重新所有的点,然后进行绘制Route,这个代码可能性能上有缺陷,但也是没有办法。

List<RadarTargetInfo> dislist = new List<RadarTargetInfo>();
//已经添加的集合
public List<RadarTargetInfo> addlist = new List<RadarTargetInfo>();
//用于画线
Dictionary<string,List<PointLatLng>> pointLatLngsDic = new Dictionary<string,List<PointLatLng>>();
//标点和数据id的关系
List<MarkerDataRole> roleList = new List<MarkerDataRole>();
/// <summary>
/// 检查数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckData(object sender, EventArgs e)
{
if (CurrentMarkerContext.list.Count == )
{
return;
}
//应该添加的数据
var list = CurrentMarkerContext.list.Except(addlist).ToList();
addlist.AddRange(list);
dislist.Clear();
foreach (var group in list.GroupBy(u => u.Id))
{
int flyId = group.Key;
RadarTargetInfo radarTarget = new RadarTargetInfo();
PointLatLng currentPoint = new PointLatLng();
foreach (var item in group)
{
PointLatLng point = new PointLatLng(item.Latitude, item.Longitude);
currentPoint = point;
//代表没有
if (roleList.FirstOrDefault(u => u.dataId == flyId) == null)
{
GMapMarker currentMarker = new GMapMarker(point);
{
currentMarker.Shape = new CustomMarker(flyId, currentMarker);
currentMarker.ZIndex = -;
currentMarker.Tag = flyId;
currentMarker.Position = point;
radarMap.Markers.Add(currentMarker);
}
roleList.Add(new MarkerDataRole(){dataId = flyId,markerId = flyId});
}
else
{
radarMap.Markers.Where(u => u.Tag != null).Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Position = point;
}
var str = flyId.ToString();
if (pointLatLngsDic.ContainsKey(str))
{
pointLatLngsDic[str].Add(point);
}
else
{
var value = new List<PointLatLng>();
value.Add(point);
pointLatLngsDic.Add(str, value);
}
radarTarget = item;
}
dislist.Add(radarTarget);
//这里找到flyId
(radarMap.Markers.Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Shape as CustomMarker).SetContent(currentPoint, flyId);
}
this.雷达目标数据.ItemsSource = dislist;
foreach (var item in radarMap.Markers.Where(u => u.Tag != null).Where(u => u.Tag.ToString() == "line").ToList())
{
radarMap.Markers.Remove(item);
}
foreach (var item in pointLatLngsDic)
{
GMapRoute gmRoute = new GMapRoute(pointLatLngsDic[item.Key])
{
Shape = new Line()
{
StrokeThickness =
},Tag = "line"
};
radarMap.Markers.Add(gmRoute);
}
}

  还有一个需要强调的是,上面说过可以通过Shape找到本身调用其方法,那个Marker上面的文本就是这么改的。

 public void SetContent(PointLatLng point, int pihao)
{
this.批号.Content = pihao.ToString();
this.纬度.Content = "纬度:" + ((int)(point.Lat * ) / 1000.0).ToString();
this.经度.Content = "纬度:" + ((int)(point.Lng * ) / 1000.0).ToString();
}

  (radarMap.Markers.Where(u => Convert.ToInt32(u.Tag) == flyId).FirstOrDefault().Shape as CustomMarker).SetContent(currentPoint, flyId);

  还有就是至于我的Wpf程序自适应问题,我都是用Viewbox做的,因为前端UI他老是玩Margin,so...你懂的!人家都是Blend for visual Studio 给搞的。也只能见谅了.

WPF中在Gmap.net中将Marker动起来的更多相关文章

  1. GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件

    GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET contro ...

  2. GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发

    在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...

  3. WPF中ListBox滚动时的缓动效果

    原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时 ...

  4. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  5. WPF中的数据绑定!!!

    引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx  数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Pap ...

  6. WPF中动态更新TextBlock文字中的超链接,文本

    1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBloc ...

  7. 在WPF中的Canvas上实现控件的拖动、缩放

    如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...

  8. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

  9. Windows 消息循环(2) - WPF中的消息循环

    接上文: Windows 消息循环(1) - 概览 win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来. 本文介绍 WPF 中是如何使用消息循环来驱动程序的. 4 消息循环在 ...

随机推荐

  1. 在Windows Python3.4 上安装NumPy、Matplotlib、SciPy和IPython

    NumPy 下载地址: http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ SciPy 下载地址: http://sourceforge. ...

  2. POJ 1797 最短路变形所有路径最小边的最大值

    题意:卡车从路上经过,给出顶点 n , 边数 m,然后是a点到b点的权值w(a到b路段的承重),求卡车最重的重量是多少可以从上面经过. 思路:求所有路径中的最小的边的最大值.可以用迪杰斯特拉算法,只需 ...

  3. 3.介绍ASP.NET Core框架

    介绍ASP.NET Core框架 在这篇文章中,我将要向你们简短介绍一下ASP.NET Core 框架.当今社会,当提到软件开发,每个人都是讨论着开源以及跨平台开发.总所周知,微软是以它的基于Wind ...

  4. window的三种系统弹框介绍

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  5. Unable to locate JAR/zip in file system as specified by the driver definitio

    把之前的驱动包删掉,然后把你的驱动包导入就行了 现在OK键就算正常了

  6. 字符串中的count()方法

    描述 Python count() 方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. 语法 count()方法语法: str.count(sub, start= 0,e ...

  7. 【tensorflow2.0】处理图片数据-cifar2分类

    1.准备数据 cifar2数据集为cifar10数据集的子集,只包括前两种类别airplane和automobile. 训练集有airplane和automobile图片各5000张,测试集有airp ...

  8. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

  9. 《Java基础复习》-控制执行流程

    最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...

  10. DOS命令集

    1.ASSOC显示或修改文件扩展名关联.ASSOC [.ext[=[fileType]]]  .ext      指定跟文件类型关联的文件扩展名  fileType  指定跟文件扩展名关联的文件类型键 ...