using MetroGauges.General; using MetroGauges.Model; using MetroGauges.ViewModel; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace MetroGauges { /// /// WpfPreview.xaml 的交互逻辑 /// public partial class WpfPreview : Window { private PointCollection othCdPts; private PointCollection pgCdPts; private PointCollection revOthCdPts; private PointCollection revPgCdPts; public WpfPreview() { InitializeComponent(); } public WpfPreview(DgViewModel k) { InitializeComponent(); DrawScale(); DrawScaleLabel(); DrawKinePoint(k); DrawCurve(); //DrawArrow(); //chartCanvas.Children.Add(DrawPLGraph(vm)); } public WpfPreview(DgViewModel l) { InitializeComponent(); DrawScale(); DrawScaleLabel(); DrawLiEquiPoint(l); DrawCurve(); //DrawArrow(); //chartCanvas.Children.Add(DrawPLGraph(vm)); } public WpfPreview(DgViewModel c) { InitializeComponent(); DrawScale(); DrawScaleLabel(); DrawCurEquiPoint(c); DrawCurve(); //DrawArrow(); //chartCanvas.Children.Add(DrawPLGraph(vm)); } private void WindowClose_Click(object sender, RoutedEventArgs e) { Close(); } //private Polyline DrawPLGraph(DataViewModel vm) //{ // PointCollection ptCol = new PointCollection(); // for (int i = 0; i < vm.Items.Count; i++) // { // DataModel dm = vm.Items[i]; // if (true) // { // } // System.Windows.Point pt = new System.Windows.Point(dm.X / 10, -dm.Y / 10); // ptCol.Add(pt); // } // RotateTransform rotateTransform = new RotateTransform(0); // TranslateTransform transTransform = new TranslateTransform(350, 550); // TransformGroup group = new TransformGroup(); // group.Children.Add(transTransform); // group.Children.Add(rotateTransform); // Polyline pl = new Polyline() // { // Points = ptCol, // StrokeThickness = 2, // Stroke = new SolidColorBrush(Colors.Red), // RenderTransformOrigin = new System.Windows.Point(0, 0), // RenderTransform = group // }; // //pl.RenderTransform = rotateTransform; // //pl.RenderTransform = transTransform; // return pl; //} /// /// 作出箭头 /// //private void DrawArrow() //{ // Path x_axisArrow = new Path();//x轴箭头 // Path y_axisArrow = new Path();//y轴箭头 // x_axisArrow.Fill = new SolidColorBrush(Color.FromRgb(0xff, 0, 0)); // y_axisArrow.Fill = new SolidColorBrush(Color.FromRgb(0xff, 0, 0)); // PathFigure x_axisFigure = new PathFigure(); // x_axisFigure.IsClosed = true; // x_axisFigure.StartPoint = new System.Windows.Point(480, 276); //路径的起点 // x_axisFigure.Segments.Add(new LineSegment(new System.Windows.Point(480, 284), false)); //第2个点 // x_axisFigure.Segments.Add(new LineSegment(new System.Windows.Point(490, 280), false)); //第3个点 // PathFigure y_axisFigure = new PathFigure(); // y_axisFigure.IsClosed = true; // y_axisFigure.StartPoint = new System.Windows.Point(36, 30); //路径的起点 // y_axisFigure.Segments.Add(new LineSegment(new System.Windows.Point(44, 30), false)); //第2个点 // y_axisFigure.Segments.Add(new LineSegment(new System.Windows.Point(40, 20), false)); //第3个点 // PathGeometry x_axisGeometry = new PathGeometry(); // PathGeometry y_axisGeometry = new PathGeometry(); // x_axisGeometry.Figures.Add(x_axisFigure); // y_axisGeometry.Figures.Add(y_axisFigure); // x_axisArrow.Data = x_axisGeometry; // y_axisArrow.Data = y_axisGeometry; // this.chartCanvas.Children.Add(x_axisArrow); // this.chartCanvas.Children.Add(y_axisArrow); //} /// /// 绘制点 /// /// private void DrawKinePoint(DgViewModel vm) { othCdPts = new PointCollection(); pgCdPts = new PointCollection(); revOthCdPts = new PointCollection(); revPgCdPts = new PointCollection(); ObservableCollection dm = vm.Items; for (int i = 0; i < dm.Count; i++) { if (dm[i].Position == PositionI.Pantograph) { pgCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revPgCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } else { othCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revOthCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } } for (int i = 0; i < dm.Count; i++) { Ellipse dataEllipse = new Ellipse { Fill = new SolidColorBrush(Color.FromRgb(28, 120, 135)), Width = 8, Height = 8, ToolTip = dm[i].Name + "(" + dm[i].X + "," + dm[i].Y + ")", //ToolTip = String.Format("{0}{1}{2}{3}{4}{5}", dm[i].Name, "(", dm[i].X, ",", dm[i].Y, ")") }; Canvas.SetLeft(dataEllipse, 350 + dm[i].X / 10 - 4);//-4是为了补偿圆点的大小,到精确的位置 Canvas.SetTop(dataEllipse, 550 - dm[i].Y / 10 - 4); chartCanvas.Children.Add(dataEllipse); } //else //{ // ObservableCollection dm = ((LiEquiViewModel)vm).Items; //} } private void DrawLiEquiPoint(DgViewModel vm) { othCdPts = new PointCollection(); pgCdPts = new PointCollection(); revOthCdPts = new PointCollection(); revPgCdPts = new PointCollection(); ObservableCollection dm = vm.Items; for (int i = 0; i < dm.Count; i++) { if (dm[i].Position2 == PositionII.Pantograph) { pgCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revPgCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } else { othCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revOthCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } } for (int i = 0; i < dm.Count; i++) { Ellipse dataEllipse = new Ellipse { Fill = new SolidColorBrush(Color.FromRgb(28, 120, 135)), Width = 8, Height = 8, ToolTip = dm[i].Name + "(" + dm[i].X + "," + dm[i].Y + ")", //ToolTip = String.Format("{0}{1}{2}{3}{4}{5}", dm[i].Name, "(", dm[i].X, ",", dm[i].Y, ")") }; Canvas.SetLeft(dataEllipse, 350 + dm[i].X / 10 - 4);//-4是为了补偿圆点的大小,到精确的位置 Canvas.SetTop(dataEllipse, 550 - dm[i].Y / 10 - 4); chartCanvas.Children.Add(dataEllipse); } //else //{ // ObservableCollection dm = ((LiEquiViewModel)vm).Items; //} } private void DrawCurEquiPoint(DgViewModel vm) { othCdPts = new PointCollection(); pgCdPts = new PointCollection(); revOthCdPts = new PointCollection(); revPgCdPts = new PointCollection(); ObservableCollection dm = vm.Items; for (int i = 0; i < dm.Count; i++) { if (dm[i].Position == PositionI.Pantograph) { pgCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revPgCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } else { othCdPts.Add(new System.Windows.Point(350 + dm[i].X / 10, 550 - dm[i].Y / 10)); revOthCdPts.Add(new System.Windows.Point(350 - dm[i].X / 10, 550 - dm[i].Y / 10)); } } for (int i = 0; i < dm.Count; i++) { Ellipse dataEllipse = new Ellipse { Fill = new SolidColorBrush(Color.FromRgb(28, 120, 135)), Width = 8, Height = 8, ToolTip = dm[i].Name + "(" + dm[i].X + "," + dm[i].Y + ")", //ToolTip = String.Format("{0}{1}{2}{3}{4}{5}", dm[i].Name, "(", dm[i].X, ",", dm[i].Y, ")") }; Canvas.SetLeft(dataEllipse, 350 + dm[i].X / 10 - 4);//-4是为了补偿圆点的大小,到精确的位置 Canvas.SetTop(dataEllipse, 550 - dm[i].Y / 10 - 4); chartCanvas.Children.Add(dataEllipse); } //else //{ // ObservableCollection dm = ((LiEquiViewModel)vm).Items; //} } private void DrawPolyline(PointCollection ptcol, Brush brush) { Polyline pl = new Polyline { Stroke = brush, StrokeThickness = 2, Points = ptcol, }; chartCanvas.Children.Add(pl); } /// /// 绘制曲线 /// private void DrawCurve() { DrawPolyline(pgCdPts, Brushes.Blue); DrawPolyline(othCdPts, Brushes.Blue); DrawPolyline(revPgCdPts, Brushes.Blue); DrawPolyline(revOthCdPts, Brushes.Blue); } /// /// 作出x轴和y轴的标尺 /// private void DrawScale() { for (int i = 0; i < 33; i += 1)//作480个刻度,因为当前x轴长 480px,每10px作一个小刻度,还预留了一些小空间 { //原点 O=(350,550) Line x_scale = new Line { StrokeEndLineCap = PenLineCap.Triangle, StrokeThickness = 1, Stroke = new SolidColorBrush(Color.FromRgb(0, 0, 0)), X1 = 350 + i * 10 //原点x=10,每10px作1个刻度 }; x_scale.X2 = x_scale.X1; //在x轴上的刻度线,起点和终点相同 x_scale.Y1 = 550; //与原点坐标的y=550,相同 if (i % 5 == 0)//每5个刻度添加一个大刻度 { x_scale.StrokeThickness = 3;//把刻度线加粗一点 x_scale.Y2 = x_scale.Y1 - 8;//刻度线长度为8px } else { x_scale.Y2 = x_scale.Y1 - 4;//刻度线长度为4px } chartCanvas.Children.Add(x_scale); } for (int i = 0; i < 53; i += 1)//由于y轴短一些,所以在此作出判断,只作25个刻度 { //作出Y轴的刻度 Line y_scale = new Line { StrokeEndLineCap = PenLineCap.Triangle, StrokeThickness = 1, Stroke = new SolidColorBrush(Color.FromRgb(0, 0, 0)), X1 = 350 //原点x=350,在y轴上的刻度线的起点与原点相同 }; if (i % 5 == 0) { y_scale.StrokeThickness = 3; y_scale.X2 = y_scale.X1 + 8;//刻度线长度为4px } else { y_scale.X2 = y_scale.X1 + 4;//刻度线长度为8px } y_scale.Y1 = 550 - i * 10; //每10px作一个刻度 y_scale.Y2 = y_scale.Y1; //起点和终点y坐标相同 chartCanvas.Children.Add(y_scale); } } /// /// 添加刻度标签 /// private void DrawScaleLabel() { for (int i = 1; i < 7; i++)//7 个标签,一共 { TextBlock x_ScaleLabel = new TextBlock { Text = (i * 500).ToString()//只给大刻度添加标签,每50px添加一个标签 }; Canvas.SetLeft(x_ScaleLabel, 350 + 5 * 10 * i - 12);//350是原点的坐标,-12是为了让标签看的位置居中一些 Canvas.SetTop(x_ScaleLabel, 550 + 2);//让标签字往下移一点 this.chartCanvas.Children.Add(x_ScaleLabel); } for (int i = 1; i < 15; i++) { TextBlock y_ScaleLabel = new TextBlock { Text = (i * 500).ToString() }; Canvas.SetLeft(y_ScaleLabel, 350 - 35); //-35px是字体大小的偏移 Canvas.SetTop(y_ScaleLabel, 550 - 5 * 10 * i - 6); //650px是原点的坐标,同样-6是为了让标签不要上坐标轴叠上 this.chartCanvas.Children.Add(y_ScaleLabel); } } private void ChartCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DragMove(); } } }