using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; namespace PipeGallery.Model { /// <summary> /// 坐标系类 /// </summary> public class CoordinatesInfoType { public CoordinatesInfoType() { } private string _yName = string.Empty; public string YName { get { return _yName; } set { _yName = value; } } private double _yMaxValue; //Y轴最大值 public double YMaxValue { get { return _yMaxValue; } set { _yMaxValue = value; } } private double _yMinValue; //Y轴最小值 public double YMinValue { get { return _yMinValue; } set { _yMinValue = value; } } private int _yMarkCount; //Y轴刻度个数 public int YMarkCount { get { return _yMarkCount; } set { _yMarkCount = value; } } private string _xName = string.Empty; //X轴的名称 public string XName { get { return _xName; } set { _xName = value; } } private double _xMaxValue; //X轴最大值 public double XMaxValue { get { return _xMaxValue; } set { _xMaxValue = value; } } private double _xMinValue; //X轴最小值 public double XMinValue { get { return _xMinValue; } set { _xMinValue = value; } } private int _xMarkCount; //X轴刻度个数 public int XMarkCount { get { return _xMarkCount; } set { _xMarkCount = value; } } #region 绘制平面曲线坐标系 //坐标轴的左边沿的X坐标点 double _xs; //坐标轴的X轴的实际长度 double _xw; //坐标轴下边沿的Y坐标点 double _ys; //坐标轴的Y轴的实际长度 double _yh; string _color; internal void DrawCoordinates(Canvas canvas, bool isXMark = false, ChartType chartType = ChartType.HomePageView) { //清空canvas canvas.Children.Clear(); //坐标轴的左边沿的X坐标点 _xs = 0; //坐标轴的X轴的实际长度 _xw = canvas.ActualWidth; //坐标轴的Y轴的实际长度 if (chartType == ChartType.FilterView) { _yh = canvas.ActualHeight; } else { _yh = canvas.ActualHeight - 50; } //坐标轴下边沿的Y坐标点 _ys = _yh; //坐标轴的Y轴的起点 Point pYStart = new Point(_xs, _ys); //X坐标轴的左起点,原点 Point pXStart = new Point(); ; if (chartType == ChartType.HomePageView) { pXStart = new Point(_xs, _ys + 10); } if (chartType == ChartType.AuditionView) { pXStart = new Point(_xs, _ys + 10); } if (chartType == ChartType.FilterView) { pXStart = new Point(_xs, _ys); } _color = "#545454"; //画坐刻度 DrawPlaneCurveMark(canvas, _color, 0, pXStart, pYStart, _xw, _yh, isXMark, chartType); //画坐标轴 DrawPlaneCurveAxis(canvas, _color, 0, pXStart, pYStart, _xw, _yh, chartType); } /// <summary> /// 画一个平面图表的坐标轴 /// </summary> /// <param name="canvas">父容器</param> /// <param name="color">坐标系线轴颜色</param> /// <param name="offset">偏移量:实现坐标系的阴影</param> /// <param name="pYStart">坐标系的Y轴的下起点</param> /// <param name="xw">坐标系X轴的实际长度</param> /// <param name="yh">坐标系Y轴的实际长度</param> internal void DrawPlaneCurveAxis(Canvas canvas, string color, double offset, Point pXStart, Point pYStart, double xw, double yh, ChartType chartType = ChartType.HomePageView) { PathGeometry axisPathGeometry = new PathGeometry(); if (chartType == ChartType.FilterView) { LineGeometry yAxisLeft = new LineGeometry(); yAxisLeft.StartPoint = new Point(pYStart.X + offset, pYStart.Y); yAxisLeft.EndPoint = new Point(pYStart.X + offset, pYStart.Y - yh); axisPathGeometry.AddGeometry(yAxisLeft); } ////画X轴 if (chartType == ChartType.HomePageView || chartType == ChartType.FilterView) { LineGeometry xAxis = new LineGeometry(); xAxis.StartPoint = new Point(pXStart.X, pXStart.Y + offset); xAxis.EndPoint = new Point(pXStart.X + xw, pXStart.Y + offset); axisPathGeometry.AddGeometry(xAxis); } Path pathAxis = new Path(); pathAxis.StrokeThickness = 1; pathAxis.Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); ; pathAxis.Data = axisPathGeometry; canvas.Children.Add(pathAxis); } /// <summary> /// 画一个平面图表的坐标刻度 /// </summary> internal void DrawPlaneCurveMark(Canvas canvas, string color, double offset, Point pXStart, Point pYStart, double xw, double yh, bool isXMark = false, ChartType chartType = ChartType.HomePageView) { PathGeometry markPathGeometry = new PathGeometry(); if (isXMark) { double xMarkWidth = _xw / XMarkCount; double xInterval = (XMaxValue - XMinValue) / XMarkCount; for (int i = 0; i < XMarkCount + 1; i++) { LineGeometry xline = new LineGeometry(); xline.StartPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y); if (chartType == ChartType.HomePageView || chartType == ChartType.FilterView) { if (i % 2 == 0) { xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 15); } else { xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 5); } } else { if (i % 2 == 0) { xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 20); } else { xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 10); } } markPathGeometry.AddGeometry(xline); if (chartType == ChartType.AuditionView) { LineGeometry xline2 = new LineGeometry(); xline2.StartPoint = new Point(pXStart.X + xMarkWidth * i, -10); if (i % 2 == 0) { xline2.EndPoint = new Point(pXStart.X + xMarkWidth * i, -30); } else { xline2.EndPoint = new Point(pXStart.X + xMarkWidth * i, -20); } markPathGeometry.AddGeometry(xline2); } } if (chartType == ChartType.HomePageView) { //TextBlock txtXMarkStartValue = new TextBlock(); //txtXMarkStartValue.FontSize = 20; //txtXMarkStartValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); //txtXMarkStartValue.Text = "" + XMinValue.ToString(); //Canvas.SetRight(txtXMarkStartValue, xw + 5); //Canvas.SetBottom(txtXMarkStartValue, 40 - 12); //canvas.Children.Add(txtXMarkStartValue); TextBlock txtXName = new TextBlock(); txtXName.FontSize = 14; txtXName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); txtXName.Text = XName.ToString(); Canvas.SetLeft(txtXName, xw + 5); Canvas.SetBottom(txtXName, 40 - 12); canvas.Children.Add(txtXName); } else if (chartType == ChartType.FilterView) { TextBlock txtXMarkMinValue = new TextBlock(); txtXMarkMinValue.TextAlignment = TextAlignment.Center; txtXMarkMinValue.Width = 50; txtXMarkMinValue.FontSize = 20; txtXMarkMinValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); txtXMarkMinValue.Text = "" + XMinValue.ToString(); Canvas.SetLeft(txtXMarkMinValue, -20); Canvas.SetTop(txtXMarkMinValue, pXStart.Y + 16); canvas.Children.Add(txtXMarkMinValue); TextBlock txtXMarkMaxValue = new TextBlock(); txtXMarkMaxValue.TextAlignment = TextAlignment.Center; txtXMarkMaxValue.Width = 50; txtXMarkMaxValue.FontSize = 20; txtXMarkMaxValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); txtXMarkMaxValue.Text = "" + XMaxValue.ToString(); Canvas.SetLeft(txtXMarkMaxValue, xw - 20); Canvas.SetTop(txtXMarkMaxValue, pXStart.Y + 16); canvas.Children.Add(txtXMarkMaxValue); TextBlock txtXName = new TextBlock(); txtXName.FontSize = 14; txtXName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); txtXName.Text = XName.ToString(); Canvas.SetLeft(txtXName, xw + 5); Canvas.SetTop(txtXName, pXStart.Y - 7); canvas.Children.Add(txtXName); } } //画Y轴Name if (chartType == ChartType.FilterView) { TextBlock txtYName = new TextBlock(); txtYName.FontSize = 14; txtYName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); txtYName.Text = YName.ToString(); Canvas.SetRight(txtYName, xw + 5); Canvas.SetTop(txtYName, 0); canvas.Children.Add(txtYName); } Path pathAxis = new Path(); if (chartType == ChartType.HomePageView) { pathAxis.StrokeThickness = 1; } else { pathAxis.StrokeThickness = 0.5; } //pathAxis.StrokeDashArray = new DoubleCollection() { 2, 3 }; pathAxis.Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); pathAxis.Data = markPathGeometry; canvas.Children.Add(pathAxis); } #endregion public double GetXPosition(double x) { double d1 = x - XMinValue; double d2 = XMaxValue - XMinValue; double d = _xw * d1 / d2; return d; } } }