private void SetLabel(RadarObj obj, Point location, double duration) { //计算偏移量 bool x = true; bool y = true; if (location.X < 0) { x = false; } if (location.Y < 0) { y = false; } //obj.Name + " " + TextBlock txb = new TextBlock() { Text = " " + obj.Name + " " + Getbfb(Count.ToString(), obj.DataValue.ToString(), 2) + " ", Foreground = this.Foreground, FontSize = this.FontSize }; Size s = ControlSizeUtils.GetTextAreaSize(txb.Text, this.FontSize); CanvasPanel.Children.Add(txb); AnimationUtils.CtrlDoubleAnimation(txb, 1000, duration); if (location.X > -5 && location.X < 5) { Canvas.SetLeft(txb, location.X - (s.Width / 2)); } else { Canvas.SetLeft(txb, location.X + (x ? 0 : -(s.Width))); } if (location.Y > -5 && location.Y < 5) { Canvas.SetTop(txb, location.Y - (s.Height / 2)); } else { Canvas.SetTop(txb, location.Y + (y ? 0 : -(s.Height))); } }
/// <summary> /// 初始化数据 /// </summary> private void initData() { CanvasPanel.Children.Clear(); if (this.Datas != null && this.Datas.Count > 0) { this.CanvasPanel.Width = this.CanvasPanel.Height = 0; //求角度比例尺 (每个值占多大的角度 可以算到每一块图所占的角度) var angelScale = 360.00 / Datas.Sum(i => i.DataValue); //最大半径 var maxRadius = (MaxSize / 2) - RoseMargin - (ShowValuesLabel ? LabelPathLength : 0); //半径比例尺 (值和比例尺相乘等于每一块图的半径) var radiusScale = maxRadius / Datas.Max(o => o.DataValue); //计算半径宽度值 for (int i = 0; i < Datas.Count; i++) { Datas[i].DataRaidus = Datas[i].DataValue * radiusScale; } //扇形角度初始化 double angleSectorStart = 0; double angleSectorEnd = 0; //循环绘制扇形区域 int scaleTimeSpan = 0; int pathTimespan = 0; int textTimeSpan = 0; for (int index = 0; index < Datas.Count; index++) { //计算扇形角度 if (index == 0) { angleSectorStart = 0; angleSectorEnd = Datas[index].DataValue * angelScale; } else if (index + 1 == Datas.Count) { angleSectorStart += Datas[index - 1].DataValue * angelScale; angleSectorEnd = 360; } else { angleSectorStart += Datas[index - 1].DataValue * angelScale; angleSectorEnd = angleSectorStart + Datas[index].DataValue * angelScale; } var currentRadius = RoseInsideMargin + Datas[index].DataRaidus; //计算扇形点位,用于绘制PATH Point ptOutSideStart = GetPoint(currentRadius, angleSectorStart * Math.PI / 180); Point ptOutSideEnd = GetPoint(currentRadius, angleSectorEnd * Math.PI / 180); Point ptInSideStart = GetPoint(RoseInsideMargin, angleSectorStart * Math.PI / 180); Point ptInSideEnd = GetPoint(RoseInsideMargin, angleSectorEnd * Math.PI / 180); if (string.IsNullOrEmpty(Datas[index].RColor)) { Datas[index].RColor = ChartColorPool.ColorStrings[index]; } Path pthSector = new Path() { Fill = Datas[index].Fill }; //PATH数据格式 M0,100 L50,100 A50,50 0 0 1 100,50 L100,0 A100,100 0 0 0 0,100 Z StringBuilder datastrb = new StringBuilder(); #region BuilderPathData datastrb.Append("M"); datastrb.Append(ptOutSideStart.X.ToString()); datastrb.Append(","); datastrb.Append(ptOutSideStart.Y.ToString()); datastrb.Append(" L"); datastrb.Append(ptInSideStart.X.ToString()); datastrb.Append(","); datastrb.Append(ptInSideStart.Y.ToString()); datastrb.Append(" A"); datastrb.Append(RoseInsideMargin.ToString()); datastrb.Append(","); datastrb.Append(RoseInsideMargin.ToString()); datastrb.Append(" 0 0 1 "); datastrb.Append(ptInSideEnd.X.ToString()); datastrb.Append(","); datastrb.Append(ptInSideEnd.Y.ToString()); datastrb.Append(" L"); datastrb.Append(ptOutSideEnd.X.ToString()); datastrb.Append(","); datastrb.Append(ptOutSideEnd.Y.ToString()); datastrb.Append(" A"); datastrb.Append(currentRadius.ToString()); datastrb.Append(","); datastrb.Append(currentRadius.ToString()); datastrb.Append(" 0 0 0 "); datastrb.Append(ptOutSideStart.X.ToString()); datastrb.Append(","); datastrb.Append(ptOutSideStart.Y.ToString()); datastrb.Append(" Z"); #endregion BuilderPathData try { pthSector.Data = (Geometry) new GeometryConverter().ConvertFromString(datastrb.ToString()); } catch (Exception exp) { } //设置扇形显示的动画 AnimationUtils.FloatElement(pthSector, 1, 200, pathTimespan += 200); AnimationUtils.ScaleRotateEasingAnimationShow(pthSector, 0.1, 1, 1500, scaleTimeSpan += 200, null); CanvasPanel.Children.Add(pthSector); if (ShowValuesLabel) { //计算延伸线角度 double lbPathAngle = angleSectorStart + (angleSectorEnd - angleSectorStart) / 2; //起点 Point ptLbStart = GetPoint(currentRadius, lbPathAngle * Math.PI / 180); //终点 Point ptLbEnd = GetPoint(maxRadius + LabelPathLength, lbPathAngle * Math.PI / 180); Path pthLb = new Path() { Stroke = Datas[index].Stroke, StrokeThickness = 1 }; pthLb.Data = (Geometry) new GeometryConverter().ConvertFromString(string.Format("M{0},{1} {2},{3}", ptLbStart.X.ToString(), ptLbStart.Y.ToString(), ptLbEnd.X.ToString(), ptLbEnd.Y.ToString())); double dur = (textTimeSpan += 200) + 1500; AnimationUtils.CtrlDoubleAnimation(pthLb, 1000, dur); CanvasPanel.Children.Add(pthLb); SetLabel(Datas[index], ptLbEnd, dur); } } this.SizeChanged -= RadarControl_SizeChanged; this.SizeChanged += RadarControl_SizeChanged; } }