日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

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

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/koloumi/article/details/77521872 如果還有不懂的請去資源區下載控件包含所有源碼

http://download.csdn.net/download/koloumi/9947692
接下來將代碼上的。
界面調整部分的代碼函數

還有一個重要的函數就是控件的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>/// 數據集/// </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軸的區間/// </summary>private VectorChart2 _xLimt = new VectorChart2(double.MaxValue, double.MinValue);/// <summary>/// Y軸的區間/// </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>/// 當前線的縮放比例/// </summary>private Vector4 _currentLinesScale = new Vector4(1, 1, 1, 1);/// <summary>/// 每個刻度之間的間隔/// </summary>private static double _everyDis = 30; 在這個控件上我們將每個刻度的間隔直接定死,這樣有需要的時候直接修改刻度上的數值,而不用去移動刻度。如果尺寸變大只要增加刻度線,減少反之。在控件中用到的數據結構 /// <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 轉換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>/// 是否為空數據/// </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>/// 繪圖數據/// </summary>public class DrawData : IDisposable{/// <summary>////// </summary>public Polyline Line;/// <summary>/// 線的標記點/// </summary>public List<Ellipse> Points = new List<Ellipse>();/// <summary>/// 源數據集合/// </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; // 要檢測冗余調用protected virtual void Dispose(bool disposing){if (!disposedValue){if (disposing){// TODO: 釋放托管狀態(托管對象)。Line = null;Ps = null;Points = null;LineTitle = null;}// TODO: 釋放未托管的資源(未托管的對象)并在以下內容中替代終結器。// TODO: 將大型字段設置為 null。disposedValue = true;}}// TODO: 僅當以上 Dispose(bool disposing) 擁有用于釋放未托管資源的代碼時才替代終結器。// ~DrawData() {// // 請勿更改此代碼。將清理代碼放入以上 Dispose(bool disposing) 中。// Dispose(false);// }// 添加此代碼以正確實現可處置模式。public void Dispose(){// 請勿更改此代碼。將清理代碼放入以上 Dispose(bool disposing) 中。Dispose(true);// TODO: 如果在以上內容中替代了終結器,則取消注釋以下行。GC.SuppressFinalize(this);}#endregion} 調整曲線 刻度(直接修改)部分:

然后是調整所有繪圖區的尺寸:

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

還有曲線刻度的添加式修改:(因為增加刪除速度比較慢,所以只在有必要的時候調用這個,比如尺寸改變的時候,平時直接修改刻度即可) /// <summary>/// 調整刻度\網格線(刪除重新添加)/// </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);}///清除網格線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);///網格線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);///網格線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);}} 調整線和點:(主要是,縮放和拖動)

調整線和點的大小比例AdjustLinesAndPointsSize 這個函數可以刪掉,后來發現沒有用。鼠標滾輪事件: /// <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)));///調整刻度AdjustLines();AdjustLinesAndPoints();} 重置按鈕:


鼠標移動的時候計算移動的差值然后調用該函數:

獲取偏移量函數:

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。