zoukankan      html  css  js  c++  java
  • 在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;
                    }
  • 相关阅读:
    C#文件拖放至窗口的ListView控件获取文件类型
    android内存释放处理
    赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印
    POJ 3070 Fibonacci 矩阵高速求法
    poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
    Codeforces Round #313 C. Gerald's Hexagon(放三角形)
    HTTP服务端JSON服务端
    iPad popView封装
    OpenCv 人脸检測的学习
    《深入理解java虚拟机》:类的初始化
  • 原文地址:https://www.cnblogs.com/goxmpx/p/3741915.html
Copyright © 2011-2022 走看看