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 消息循环在 ...
随机推荐
- Java GC(垃圾回收)机制知识总结
目录 Java GC系列 Java关键术语 Java HotSpot 虚拟机 JVM体系结构 Java堆内存 启动Java垃圾回收 Java垃圾回收过程 垃圾回收中实例的终结 对象什么时候符合垃圾回收 ...
- python之面向对象的关系
一.从空间角度研究类 类外面可以给对象封装属性 class A: address = '美丽富饶的沙河' def __init__(self, name): self.name = name def ...
- 斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...
[导读]斯坦福大学的人工智能课程"CS 221"至今仍然是人工智能学习课程的经典之一.为了方便广大不能亲临现场听讲的同学,课程官方推出了课程笔记CheatSheet,涵盖4大类模型 ...
- coding++:高并发解决方案限流技术-使用RateLimiter实现令牌桶限流-Demo
RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时 ...
- C# Protobuf如何做到0分配内存的序列化
题目很简单, 就是IMessage对象怎么变成Byte[] 答案1: msg.ToByteArray() 这肯定不符合我们的要求 答案2: using var memoryStream = new M ...
- java web综合案例
1.采用的技术: bootstrap+jsp+servlet+三层架构(servlet,service,dao)+mysql 注意:mysql使用的是5.5版本,使用高版本会有很多问题.可以将5.5版 ...
- Java的浅拷贝与深拷贝总结
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- 【Net】ABP框架学习之正面硬钢
前言 本文介绍另一种学习ABP框架的方法,该方法为正面硬钢学习法... 我们不去官网下载模板,直接引用DLL,直接使用. WebApi项目创建 首先创建一个WebApi项目,结构如下. 然后Nuget ...
- 6.Metasploit生成apk攻击Android实例
Metasploit进阶第四讲 生成Android apk文件 01 msfvenom基本参数 msfvenom介绍 承接上回,staged/unstage payload如何利用? msfven ...
- 1007 Maximum Subsequence Sum (25 分)
1007 Maximum Subsequence Sum (25 分) Given a sequence of K integers { N1, N2, ..., NK }. A ...