日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

WPF 曲线图表控件(自制)(二)

發(fā)布時間:2025/4/16 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF 曲线图表控件(自制)(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:WPF 曲線圖表控件(自制)(二)

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/koloumi/article/details/77521872 如果還有不懂的請去資源區(qū)下載控件包含所有源碼

http://download.csdn.net/download/koloumi/9947692
接下來將代碼上的。
界面調(diào)整部分的代碼函數(shù)

還有一個重要的函數(shù)就是控件的MyChart_SizeChanged事件。 /// <summary>/// 尺寸改變/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MyChart_SizeChanged(object sender, SizeChangedEventArgs e){Size newsize = e.NewSize;if(!e.WidthChanged){this.Width = newsize.Width;}if(!e.HeightChanged){this.Height = newsize.Height;}AdjustSize();AdjustScale();AdjustLines();AdjustLinesAndPoints();} 接下來是先看下定義的屬性: /// <summary>/// 數(shù)據(jù)集/// </summary>private Dictionary<string, DrawData> _data = new Dictionary<string, DrawData>();/// <summary>/// 坐標原點/// </summary>private Point _origPoint = new Point();/// <summary>/// X軸上的文字/// </summary>private List<TextBlock> _xTip = new List<TextBlock>();/// <summary>/// Y軸上的文字/// </summary>private List<TextBlock> _yTip = new List<TextBlock>();/// <summary>/// X軸的區(qū)間/// </summary>private VectorChart2 _xLimt = new VectorChart2(double.MaxValue, double.MinValue);/// <summary>/// Y軸的區(qū)間/// </summary>private VectorChart2 _yLimt = new VectorChart2(double.MaxValue, double.MinValue);/// <summary>/// 每個像素映射為多少距離/// </summary>private VectorChart2 _everyDisForPiexl = new VectorChart2();/// <summary>/// 縮放中心點的偏移/// </summary>private VectorChart2 _centerOffect = new VectorChart2(0, 0);/// <summary>/// 當(dāng)前線的縮放比例/// </summary>private Vector4 _currentLinesScale = new Vector4(1, 1, 1, 1);/// <summary>/// 每個刻度之間的間隔/// </summary>private static double _everyDis = 30; 在這個控件上我們將每個刻度的間隔直接定死,這樣有需要的時候直接修改刻度上的數(shù)值,而不用去移動刻度。如果尺寸變大只要增加刻度線,減少反之。在控件中用到的數(shù)據(jù)結(jié)構(gòu) /// <summary>/// 向量/// </summary>public struct VectorChart2{public double Vec1;public double Vec2;public VectorChart2(double v1, double v2){this.Vec1 = v1;this.Vec2 = v2;}/// <summary>/// Point 轉(zhuǎn)換VectorChart2/// </summary>/// <param name="p"></param>public static implicit operator VectorChart2(Point p){return new VectorChart2(p.X, p.Y);}/// <summary>/// 乘法/// </summary>/// <param name="v1"></param>/// <param name="ratio"></param>/// <returns></returns>public static VectorChart2 operator * (VectorChart2 v1, double ratio){return new VectorChart2(v1.Vec1 * ratio, v1.Vec2 * ratio);}}/// <summary>/// 4維向量/// </summary>public struct Vector4{/// <summary>////// </summary>public static Vector4 Empty = new Vector4() { _isEmpty = true };public double Vec1;public double Vec2;public double Vec3;public double Vec4;/// <summary>/// 是否為空數(shù)據(jù)/// </summary>private bool _isEmpty;public Vector4(double Vec1, double Vec2, double Vec3, double Vec4){this.Vec1 = Vec1;this.Vec2 = Vec2;this.Vec3 = Vec3;this.Vec4 = Vec4;_isEmpty = false;}/// <summary>/// 重載等號運算符/// </summary>/// <param name="v1"></param>/// <param name="v2"></param>/// <returns></returns>public static bool operator ==(Vector4 v1, Vector4 v2){if (v1.Vec1 == v2.Vec1 && v1.Vec2 == v2.Vec2 && v1.Vec3 == v2.Vec3 && v1.Vec4 == v2.Vec4 && v1._isEmpty == v2._isEmpty){return true;}else{return false;}}/// <summary>/// 重載/// </summary>/// <param name="v1"></param>/// <param name="v2"></param>/// <returns></returns>public static bool operator !=(Vector4 v1, Vector4 v2){return !(v1 == v2);}public override bool Equals(object obj){return base.Equals(obj);}public override int GetHashCode(){return base.GetHashCode();}}/// <summary>/// 繪圖數(shù)據(jù)/// </summary>public class DrawData : IDisposable{/// <summary>////// </summary>public Polyline Line;/// <summary>/// 線的標記點/// </summary>public List<Ellipse> Points = new List<Ellipse>();/// <summary>/// 源數(shù)據(jù)集合/// </summary>public ObservableCollection<Point> Ps = null;/// <summary>/// 極值/// </summary>public Vector4 Vec4 = Vector4.Empty;/// <summary>/// 提示/// </summary>public LineTitle LineTitle = new LineTitle();public DrawData(){}~DrawData(){this.Dispose();}#region IDisposable Supportprivate bool disposedValue = false; // 要檢測冗余調(diào)用protected virtual void Dispose(bool disposing){if (!disposedValue){if (disposing){// TODO: 釋放托管狀態(tài)(托管對象)。Line = null;Ps = null;Points = null;LineTitle = null;}// TODO: 釋放未托管的資源(未托管的對象)并在以下內(nèi)容中替代終結(jié)器。// TODO: 將大型字段設(shè)置為 null。disposedValue = true;}}// TODO: 僅當(dāng)以上 Dispose(bool disposing) 擁有用于釋放未托管資源的代碼時才替代終結(jié)器。// ~DrawData() {// // 請勿更改此代碼。將清理代碼放入以上 Dispose(bool disposing) 中。// Dispose(false);// }// 添加此代碼以正確實現(xiàn)可處置模式。public void Dispose(){// 請勿更改此代碼。將清理代碼放入以上 Dispose(bool disposing) 中。Dispose(true);// TODO: 如果在以上內(nèi)容中替代了終結(jié)器,則取消注釋以下行。GC.SuppressFinalize(this);}#endregion} 調(diào)整曲線 刻度(直接修改)部分:

然后是調(diào)整所有繪圖區(qū)的尺寸:

極值的調(diào)整 這里乘以0.15 是為了擴大上限 讓初始曲線能夠包括在視圖中。

還有曲線刻度的添加式修改:(因為增加刪除速度比較慢,所以只在有必要的時候調(diào)用這個,比如尺寸改變的時候,平時直接修改刻度即可) /// <summary>/// 調(diào)整刻度\網(wǎng)格線(刪除重新添加)/// </summary>protected void AdjustScale(){//if (!IsHaveLine) return;if (X_Axis.Width == 0 || X_Axis.Height == 0 || X_Axis.Width == double.NaN || X_Axis.Height == double.NaN) return;//if (GridLines.Width == 0 || GridLines.Height == 0 || GridLines.Width == double.NaN || double.IsNaN(GridLines.Height)) return;///清除X軸的刻度if (X_Axis.Children.Count > 1){X_Axis.Children.RemoveRange(1, X_Axis.Children.Count - 1);}///清除Y軸的刻度if (Y_Axis.Children.Count > 1){Y_Axis.Children.RemoveRange(1, Y_Axis.Children.Count - 1);}///清除網(wǎng)格線GridLines.Children.Clear();///清除刻度線的提示文字_xTip.Clear();_yTip.Clear();///添加X軸的for (double i = _origPoint.X; i < X_Axis.Width; i += _everyDis){Line x_scale = new Line();x_scale.StrokeThickness = 2;x_scale.Stroke = new SolidColorBrush(Colors.Black);x_scale.StrokeStartLineCap = PenLineCap.Round;x_scale.StrokeEndLineCap = PenLineCap.Round;x_scale.Width = 4;x_scale.Height = 20;x_scale.X1 = 2;x_scale.Y1 = 4;x_scale.X2 = 2;x_scale.Y2 = x_scale.Height;Canvas.SetLeft(x_scale, i);Canvas.SetTop(x_scale, 0);X_Axis.Children.Add(x_scale);///網(wǎng)格線GridLines.Children.Add(GetGridLine(new Point(i - 2, 0), false, GridLinesArea.Vec2));//double.IsNaN(GridLines.Height) ? GridLines.ActualHeight : GridLines.Height///添加提示文字TextBlock block = new TextBlock();block.FontSize = 10;block.Text = i.ToString();Canvas.SetLeft(block, i);Canvas.SetTop(block, 25);_xTip.Add(block);X_Axis.Children.Add(block);}///添加Y軸的for (double i = _origPoint.Y; i < Y_Axis.Height; i += _everyDis){Line y_scale = new Line();y_scale.StrokeThickness = 2;y_scale.Stroke = new SolidColorBrush(Colors.Black);y_scale.StrokeStartLineCap = PenLineCap.Round;y_scale.StrokeEndLineCap = PenLineCap.Round;y_scale.Width = 20;y_scale.Height = 4;y_scale.X1 = 4;y_scale.Y1 = 2;y_scale.X2 = y_scale.Width;y_scale.Y2 = 2;Canvas.SetBottom(y_scale, i + 1);Canvas.SetRight(y_scale, 2);Y_Axis.Children.Add(y_scale);///網(wǎng)格線GridLines.Children.Add(GetGridLine(new Point(i - 2, 0), true, GridLinesArea.Vec1));//double.IsNaN(GridLines.Width) ? GridLines.ActualWidth : GridLines.Width)///添加提示文字TextBlock block = new TextBlock();block.FontSize = 10;block.Text = i.ToString();Canvas.SetBottom(block, i);Canvas.SetRight(block, 10);_yTip.Add(block);Y_Axis.Children.Add(block);}} 調(diào)整線和點:(主要是,縮放和拖動)

調(diào)整線和點的大小比例AdjustLinesAndPointsSize 這個函數(shù)可以刪掉,后來發(fā)現(xiàn)沒有用。鼠標滾輪事件: /// <summary>/// 鼠標滾輪事件/// </summary>/// <param name="e"></param>protected override void OnMouseWheel(MouseWheelEventArgs e){base.OnMouseWheel(e);VectorChart2 curPDraw = (VectorChart2)e.GetPosition(Draw);VectorChart2 curPLinesAndPoint = (VectorChart2)e.GetPosition(DrawLineAndPoint);double delta = 1;if(e.Delta >= 120){delta = 1.2;}else if(e.Delta <= -120){delta = (double)5 / (double)6;}if (IsXZoom){DrawLineAndPoint.Width *= delta;curPDraw.Vec1 *= delta;curPLinesAndPoint.Vec1 *= delta;}if (IsYZoom){DrawLineAndPoint.Height *= delta;curPDraw.Vec2 *= delta;curPLinesAndPoint.Vec2 *= delta;}_currentLinesScale.Vec4 *= delta;//Canvas.SetLeft(DrawLineAndPoint, curPDraw.Vec1 - curPLinesAndPoint.Vec1);//Canvas.SetBottom(DrawLineAndPoint, -(DrawArea.Vec2 - (curPLinesAndPoint.Vec2 - curPDraw.Vec2)));///調(diào)整刻度AdjustLines();AdjustLinesAndPoints();} 重置按鈕:


鼠標移動的時候計算移動的差值然后調(diào)用該函數(shù):

獲取偏移量函數(shù):

/// <summary>/// 獲取偏移量/// </summary>/// <returns></returns>protected VectorChart2 GetOffectValue(VectorChart2 offectValue){return new VectorChart2( -offectValue.Vec1 * _everyDisForPiexl.Vec1, offectValue.Vec2 * _everyDisForPiexl.Vec2);} 至此全部結(jié)束 如果還有不懂的請去資源區(qū)下載控件包含所有源碼

http://download.csdn.net/download/koloumi/9947692

總結(jié)

以上是生活随笔為你收集整理的WPF 曲线图表控件(自制)(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。