/// <summary> /// 设置圆的位置和旋转角度 /// </summary> private void SetEclipsePosition(ProgressBarDataModel dataModel) { //圆周长就是:C = π * d 或者C=2*π*r(其中d是圆的直径,r是圆的半径) double r = dataModel.R; var children = ProgressBarCanvas.Children; int count = children.Count; double step = (Math.PI * 2) / count; //根据圆中正弦、余弦计算距离 int index = 0; foreach (var element in children) { var ellipse = element as Ellipse; //透明度 var opacity = Convert.ToDouble(index) / (count - 1); ellipse.SetValue(UIElement.OpacityProperty, opacity < 0.05 ? 0.05 : opacity); //距离 double left = r + Math.Sin(step * index) * r; ellipse.SetValue(Canvas.LeftProperty, left); double top = r - Math.Cos(step * index) * r; ellipse.SetValue(Canvas.TopProperty, top); index++; } }
/// <summary> /// 加载后刷新 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ProgressBarControl_OnLoaded(object sender, RoutedEventArgs e) { animationTimer = new DispatcherTimer(DispatcherPriority.ContextIdle, Dispatcher); //指定时间间隔 animationTimer.Interval = new TimeSpan(0, 0, 0, 0, TimeSpan); if (EllipseCount < 1) { EllipseCount = 12; } ProgressBarCanvas.Children.Clear(); for (int i = 0; i < EllipseCount; i++) { ProgressBarCanvas.Children.Add(new Ellipse()); } var dataModel = new ProgressBarDataModel() { CanvasSize = CanvasSize, EclipseSize = EllipseSize }; _dataModel = dataModel; this.DataContext = dataModel; }