WPF中在Gmap.net中将Marker动起来
出处来源于博客园 作者张子浩 原文地址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动起来的更多相关文章
- GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件
GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free, cross platform, open source .NET contro ...
- GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发
在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...
- WPF中ListBox滚动时的缓动效果
原文:WPF中ListBox滚动时的缓动效果 上周工作中遇到的问题: 常规的ListBox在滚动时总是一格格的移动,感觉上很生硬. 所以想要实现类似Flash中的那种缓动的效果,使ListBox滚动时 ...
- 基于C#在WPF中使用斑马打印机进行打印【转】
原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...
- WPF中的数据绑定!!!
引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx 数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Pap ...
- WPF中动态更新TextBlock文字中的超链接,文本
1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBloc ...
- 在WPF中的Canvas上实现控件的拖动、缩放
如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- Windows 消息循环(2) - WPF中的消息循环
接上文: Windows 消息循环(1) - 概览 win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来. 本文介绍 WPF 中是如何使用消息循环来驱动程序的. 4 消息循环在 ...
随机推荐
- 医学图像dcm2d切片文件转3dnii文件
安装 conda: conda install -c conda-forge dicom2nifti pip: pip install dicom2nifti 更新 conda: conda upda ...
- XHTML 简介
一.XHTML 简介 XHTML 指可扩展超文本标签语言(EXtensible HyperText Markup Language). XHTML 的目标是取代 HTML. XHTML 与 HTML ...
- 8.MSFvenom
Meterpreter 01 Meterpreter API调用 Meterpreter提供了多种APl调用,在编写自己的脚本时可以使用这些API来提供额外功能或定制功能. 关于ruby的更多信息,请 ...
- 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单
这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...
- stm32:extern关键字
参考:http://c.biancheng.net/view/404.html 1.在一个文件中: #include <stdio.h> int max(int x,int y); int ...
- css中border-sizing属性详解和应用
box-sizing用于更改用于计算元素宽度和高度的默认的 CSS 盒子模型.它有content-box.border-box和inherit三种取值.inherit指的是从父元素继承box-sizi ...
- Ptask
这是一款非常弱鸡的小程序,不喜勿喷 你们好!如在使用中有bug或者有您宝贵的建议请在下方评论区留言或者投递至我的邮箱:Mj_Ymr@outlook.com. 那么我也会不断更新,并在这里贴上各版本的下 ...
- ACL,NAT的使用
项目练习 练习一: 练习目的:通过配置路由器的dhcp功能使pc自动获取ip地址. Router>enable Router#configure terminal Router(config) ...
- resetFields() 有时无效问题
elementui在重置表单时,无法使用this.$refs['formRefVal'].resetFields()清空表单数据; elementui 设置rules后没有效果 解决方法: prop属 ...
- Linux 文件管理篇(三 属性管理)
可读 r 可写 w 可执行 x 档案属性: 第一栏:执行list -al后第一栏的十个标志[1 - 10] 1: d 目录 - 档案 l 连 ...