在DrawingVisual上绘制圆形的进度条,类似于IOS系统风格。

1.说明:在WPF中,文件下载时需要显示下载进度,由于系统自带的条型进度条比较占用空间,改用圆形的进度条,需要在DrawingVisual上呈现。

运行的效果如图:

               private Point GetPointOnCir(Point CenterPoint, double r, double angel){Point p = new Point();p.X = Math.Sin(angel * Math.PI / 180) * r + CenterPoint.X;p.Y = CenterPoint.Y - Math.Cos(angel * Math.PI / 180) * r;return p;}private Geometry drawingArc(Point bigCirclefirstPoint, Point bigCirclesecondPoint, Point smallCirclefirstPoint, Point smallCirclesecondPoint, double bigCircleRadius, double smallCircleRadius,bool  isLargeArc){PathFigure pathFigure = new PathFigure { IsClosed = true };pathFigure.StartPoint = bigCirclefirstPoint;pathFigure.Segments.Add(new ArcSegment{Point = bigCirclesecondPoint,IsLargeArc = isLargeArc,Size = new Size(bigCircleRadius, bigCircleRadius),SweepDirection = SweepDirection.Clockwise});pathFigure.Segments.Add(new LineSegment { Point = smallCirclesecondPoint });pathFigure.Segments.Add(new ArcSegment{Point = smallCirclefirstPoint,IsLargeArc = isLargeArc,Size = new Size(smallCircleRadius, smallCircleRadius),SweepDirection = SweepDirection.Counterclockwise});PathGeometry pathGeometry = new PathGeometry();pathGeometry.Figures.Add(pathFigure);return pathGeometry;}//根据已保存的大小和文件总大小来计算下载进度百分比private Geometry GetGeometry(){bool isLargeArc =false;double percent = double.Parse(Convert.ToString(savedSize)) / double.Parse(Convert.ToString(fileSize));PercentString = string.Format("{0}%",Math.Round(percent*100,0));double angel = percent * 360D;if(angel>180)isLargeArc=true;//double angel = 45;double bigR = 16;double smallR = 13;Point centerPoint = vl.StartPoint;//new Point(100, 300);Point firstpoint = GetPointOnCir(centerPoint, bigR, 0);Point secondpoint = GetPointOnCir(centerPoint, bigR, angel);Point thirdpoint = GetPointOnCir(centerPoint, smallR, 0);Point fourpoint = GetPointOnCir(centerPoint, smallR, angel);return drawingArc(firstp, secondpoint, thirdpoint, fourpoint, bigR, smallR, isLargeArc);}

 

画圆形的进度条,实际上是动态画两个同心圆,根据文件保存的百分比来计算画弧形的角度的大小,需要7个参数:大圆的半径bigR 、小圆的半径smallR 、同心圆的圆心centerPoint 、大圆的起始点firstpoint 、大圆的结束点secondpoint 、小圆的起始点thirdpoint、小圆的结束点fourpoint

 

 

最后需要使用DrawingContext把圆给画出来:

                public Visual drawShape(){DrawingVisual drawingWordsVisual = new DrawingVisual();DrawingContext drawingContext = drawingWordsVisual.RenderOpen();try{if (savedSize != fileSize){
                                        drawingContext.DrawEllipse(null, new Pen(Brushes.Gray, 3), vl.StartPoint, 13, 13);drawingContext.DrawGeometry(vs.VisualBackgroundBrush, vs.VisualFramePen, GetGeometry());FormattedText formatWords = new FormattedText(PercentString, System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(vs.WordsFont.Name), vs.WordsFont.Size, currentStyle.VisualBackgroundBrush);formatWords.SetFontWeight(FontWeights.Bold);Point startPoint = new Point(vl.StartPoint.X - formatWords.Width / 2, vl.StartPoint.Y - formatWords.Height / 2);drawingContext.DrawText(formatWords, startPoint);}else{drawingContext.DrawEllipse(null, new Pen(Brushes.Green, 3), vl.StartPoint, 16, 16);FormattedText formatWords = new FormattedText("Open", System.Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(vs.WordsFont.Name), vs.WordsFont.Size, Brushes.Red);formatWords.SetFontWeight(FontWeights.Bold);Point startPoint = new Point(vl.StartPoint.X - formatWords.Width / 2, vl.StartPoint.Y - formatWords.Height / 2);drawingContext.DrawText(formatWords, startPoint);}}catch (Exception ex){new SaveExceptionInfo().SaveLogAsTXTInfoex(ex.Message);}finally{drawingContext.Close();}return drawingWordsVisual;}

转载于:https://www.cnblogs.com/goxmpx/p/3741915.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discuz论坛架设从零起步之四

前期工作: 按Discuz论坛架设从零起步之一([url]http://waringid.blog.51cto.com/65148/50906[/url]) Discuz论坛架设从零起步之二([url]http://waringid.blog.51cto.com/65148/50940[/url]) Discuz论坛架设从零起步之三…

web app小程序各种客服窗口插件

http://qiyukf.com/docs/guide/web/# 网易七鱼在线客服 <html><head><title>在线客服</title><meta charset"utf-8"/></head><body><script>(function (w, d, n, a, j) {w[n] w[n] || function () {return (w[n].…

Javascript中的类实现

Javascript本身并不支持面向对象&#xff0c;它没有访问控制符&#xff0c;它没有定义类的关键字class&#xff0c;它没有支持继承的extend或冒号&#xff0c;它也没有用来支持虚函数的virtual&#xff0c;不过&#xff0c;Javascript是一门灵活的语言&#xff0c;下面我们就看…

CSS Grid布局(1)

1.网格容器:通过display属性设置属性值为grid或inline-grid可以创建一个网格容器。网格容器中的所有子元素就会自动变成网格项目&#xff08;grid item&#xff09; 1.1网格项目默认放在行中&#xff0c;并且跨网格容器的全宽 2.显示网格:使用grid-template-columns和grid-tem…

mvc 笔记

{ ViewBag.Title "主页"; } <div>这里就是渲染Body啦.~~不需要写神马<asp:Content />,其实因为RenderBody()不在有歧义. </div> <h2>ViewBag.Message</h2> <p>若要了解有关 ASP.NET MVC 的更多信息&#xff0c;请访问 <a hr…

logogogo最新变种XP.exe的分析(Win32.Logogo)

作者&#xff1a;清新阳光 ( [url]http://hi.baidu.com/newcenturysun[/url])日期&#xff1a;2007/11/17 (转载请保留此声明) 这是之前logogo.exe病毒的…

页面性能优化参考建议

依据uniapp总结的性能优化建议 链接地址https://uniapp.dcloud.io/performance 链接地址https://zhuanlan.zhihu.com/p/121056616

ffmpeg: error while loading shared libraries: libavdevice.so.52

今天在编译安装ffmpeg的时候出现了题目中的问题&#xff0c;最终解决方案如下&#xff1a; errors: ffmpeg正常安装后执行ffmpeg时出现如下错误&#xff1a;ffmpeg: error while loading shared libraries: libavdevice.so.52: cannot open shared object file: No such file o…

深入::first-letter的研究

:first-letter 伪元素用来向文本的第一个字母添加特殊样式 1.::first-letter伪元素生效的前提 1.首先&#xff0c;元素的display计算值必须是 block, inline-block, table-cell, list-item或者table-caption&#xff0c;其他所有display计算值都没有用&#xff0c;包括displa…

ASP.NET弹出一个对话框

我们在ASP.NET程序的开发过程中&#xff0c;常常需要向用户给出提示信息&#xff0c;比如是否“操作成功”&#xff0c;“确定”还是“取消”操作。 (1) 点击页面上的按钮&#xff0c;弹出一个对话框提示是“确定”还是“取消”操作&#xff0c;我们采用在按钮中添加属性…

Taro+react开发(16)--跳转拿参

1、this.$router.params.参数key2、引用 taro 框架自带的import Taro, {getCurrentInstance} from tarojs/taroconst params getCurrentInstance().router.paramsparams.参数key

[转]Android Activity和Intent机制学习笔记

Activity Android中&#xff0c;Activity是所有程序的根本&#xff0c;所有程序的流程都运行在Activity之中&#xff0c;Activity具有自己的生命周期&#xff08;见http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html&#xff0c;由系统控制生命周期&#xff0c;程…

vue swiper循环播放无效解决

因为swiper内容是动态的&#xff0c;初始化时没有数据&#xff0c; 所以加上observer:true,//修改swiper自己或子元素时&#xff0c;自动初始化swiper observeParents:true,//修改swiper的父元素时&#xff0c;自动初始化swiper,两行代码 还需要在swiper上写个v-if判断有数据后…

《致师弟的回信:应届生如何成为一名产品经理?》转载自互联网

原文如下&#xff1a; 今天很意外收到一位师弟的电子邮件&#xff0c;主要咨询职业发展的问题&#xff0c;先附上邮件部分内容&#xff1a;我是华南师范大学2009级金融学的学生罗师弟&#xff0c;来自南海校区&#xff0c;目前正处于求职时期&#xff0c;有一些职业发展&#x…

聊一聊CSS中的死循环

什么是死循环呢&#xff1f;&#xff1f;比如一个<div>元素里面有一张vertical-align为bottom同时高度为192像素的图片&#xff0c;此时该<div>高度就是192像素&#xff0c;假设此时&#xff0c;插入一个子元素&#xff0c;高度设为100%&#xff0c;如果此时height…

微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字

/******************************************************************************* 文 件 名 : test100.cpp 实现功能 : 微软面试题&#xff1a;有100万个数字&#xff08;1到9&#xff09;&#xff0c;其中只有1个数字重复2次&#xff0c;如何快速找出该数字补充下题目 意思…

电影推荐之《哈利·波特与火焰杯》 隐私策略(Privacy policy)

1.隐私政策涵盖您对本应用的使用。 2.电影推荐之《哈利波特与火焰杯》不会收集、存储、分享您的任何个人信息或者与您的设备相关的信息。我们不会收集任何统计数据和分析数据&#xff0c;也不会跟踪用户的行为。转载于:https://www.cnblogs.com/zhhabo/p/3749602.html