实现一个雷达扫描图。 源代码在TK_King/雷达 (gitee.com) https://gitee.com/TK_King/radar,自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割线 绘制扫描范围 添加扫描点 具体实现 首先
实现一个雷达扫描图。 源代码在TK_King/雷达 (gitee.com) https://gitee.com/TK_King/radar,自行下载就好了 制作思路
具体实现首先我们使用自定义的控件。你可以使用vs自动添加,也可以手动创建类。注意手动创建时要创建Themes/Generic.xaml的文件路径哦。 控件继承自itemscontrol,取名叫做Radar。 我们第一步思考如何实现圆形或者轮,特别是等距的轮。 我们可以使用简单的itemscontrol的WPF控件,通过自定义ItemTemplate就可以简单的创建了。 因为要显示圆,所以使用Ellipse是最简单的事情。 又因为要在同一个区域内,显示同心圆,我们将面板改为Grid,利用叠加的特性去构造同心圆。 既然我们用了itemscontrol 来承载圈轮,直接让这个圈可自定义呢? 所以,我们构造一个集合依赖属性。关于集合依赖属性我们可以参考MSDN官方文档
对应泛型类可以参考源代码,基本元素就是绑定ellipse的参数
哇啦,图像就出来了。 同理,我们创建分割线也是同样的过程。 对于分割线的切割算法,我们使用圆上点的坐标可以通过( rcos,rsin)=》(x,y) ,也就是极坐标。 关于此部分代码是放在布局块内ArrangeOverride,也可以放置在OnReader。 下面是局部代码,完整可以参考源代码
依赖属性
xaml代码
下一步就是扇形扫描了。 我们使用一个完整的圆,将其内部颜色填充为线性刷就可以得到一个效果不错的扫描了。
为了更好的定义这个圆,我们将radar的template使用grid面板等距分成四个区域(其实没啥用,主要是为了扇形扫描时做圆心选择的line,也可以不分成四个)。 在考虑动画,只需要做圆形360的选择就可以了。为了更好应用,我们创一个paly的依赖属性来播放动画。
xaml代码( 部分)
效果 那么剩下就是扫描点的操作。 因为我们的控件是继承ItemsControl,我们到现在还没有利用ItemsSource这个属性。 所以我们要制作一个子控件来呈现扫描点。 由于子控件较为简单,只不过是一个圆而已。我们就让子控件继承Control就好了。 一切从简,我们不弄布局这一套了,直接在父控件中使用Canvas面板,子控件增加属性Left,Top这两个依赖属性。 重点说一下,子控件中存在一个linscar的方法,是为了将点如果在雷达外侧时,按照同角度缩放到最外层的方法。就是通过半径重新计算一边极坐标。
那么在父项中如何摆放呢? 我们刚才说父项使用canvas绘图,所以我们在radar中修改itempanel的面板属性,下面代码存在于父项xaml
子项代码如下,比较少就贴了 xaml代码
radarItem
于是乎我们就得到了一个雷达扫描图 |
2019-09-10
2019-09-10
2019-10-03
2022-02-21
2022-05-10