ZedGraph5.1.5源碼分析去掉滑鼠懸浮內容閃爍問題(附源碼下載)

来源:https://www.cnblogs.com/badaoliumangqizhi/archive/2020/01/07/12160491.html
-Advertisement-
Play Games

場景 在使用ZedGraph繪製曲線圖時,將滑鼠懸浮時內容閃爍,且頻率很高。 找到其源碼,發現不論滑鼠移動的範圍大小,甚至乎不論滑鼠是否移動,都要刷新一次Tooltip。 註: 博客主頁:https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲 ...


場景

在使用ZedGraph繪製曲線圖時,將滑鼠懸浮時內容閃爍,且頻率很高。

 

 

找到其源碼,發現不論滑鼠移動的範圍大小,甚至乎不論滑鼠是否移動,都要刷新一次Tooltip。

註:

博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關註公眾號
霸道的程式猿
獲取編程相關電子書、教程推送與免費下載。

實現

首先來到ZedGraph的官網

https://sourceforge.net/projects/zedgraph/

然後點擊File下的zedgraph source

 

 

選擇對應版本,這裡是5.1.5

 

 

下載成功後,將zip解壓

找到source下的工程文件,雙擊使用VS打開

 

 

然後找到ZedGraphControl.Events.cs

 

 

找到其ZedGraphControl_MouseMove方法此方法是滑鼠移動時的事件處理

可以看到其對兩個方法的處理,一個是HandlePointValues,這是對顯示線上的點的坐標時的處理,一個是HandleCursorValues這是對獲取最近曲線上的點的坐標時的處理。

 

 

這樣看你的ZedGraph是開啟的哪樣設置。

假如是設置經過線上點時才顯示

zgc.IsShowPointValues = true;

 

那麼就要修改

HandlePointValues( mousePt );

這個方法

首先聲明一個類變數

private object lastObj;

 

用來存儲上一次使用的對象,然後找到其判斷條件,添加當前是否與上一次是同一對象

 

 

然後在最後方法返回時將當前對象賦值給上一次對象。

lastObj = nearestObj;

 

完整參考代碼

private Point HandlePointValues( Point mousePt )
  {
   int iPt;
   GraphPane pane;
   object nearestObj;

   using ( Graphics g = this.CreateGraphics() )
   {

    if ( _masterPane.FindNearestPaneObject( mousePt,
     g, out pane, out nearestObj, out iPt ) )
    {
                    if (nearestObj is CurveItem && iPt >= 0 && !object.Equals(nearestObj, lastObj))
     {
      CurveItem curve = (CurveItem)nearestObj;
      // Provide Callback for User to customize the tooltips
      if ( this.PointValueEvent != null )
      {
       string label = this.PointValueEvent( this, pane, curve, iPt );
       if ( label != null && label.Length > 0 )
       {
        this.pointToolTip.SetToolTip( this, label );
        this.pointToolTip.Active = true;
       }
       else
        this.pointToolTip.Active = false;
      }
      else
      {

       if ( curve is PieItem )
       {
        this.pointToolTip.SetToolTip( this,
         ( (PieItem)curve ).Value.ToString( _pointValueFormat ) );
       }
       //       else if ( curve is OHLCBarItem || curve is JapaneseCandleStickItem )
       //       {
       //        StockPt spt = (StockPt)curve.Points[iPt];
       //        this.pointToolTip.SetToolTip( this, ( (XDate) spt.Date ).ToString( "MM/dd/yyyy" ) + "\nOpen: $" +
       //        spt.Open.ToString( "N2" ) +
       //        "\nHigh: $" +
       //        spt.High.ToString( "N2" ) + "\nLow: $" +
       //        spt.Low.ToString( "N2" ) + "\nClose: $" +
       //        spt.Close.ToString
       //        ( "N2" ) );
       //       }
       else
       {
        PointPair pt = curve.Points[iPt];

        if ( pt.Tag is string )
         this.pointToolTip.SetToolTip( this, (string)pt.Tag );
        else
        {
         double xVal, yVal, lowVal;
         ValueHandler valueHandler = new ValueHandler( pane, false );
         if ( ( curve is BarItem || curve is ErrorBarItem || curve is HiLowBarItem )
           && pane.BarSettings.Base != BarBase.X )
          valueHandler.GetValues( curve, iPt, out yVal, out lowVal, out xVal );
         else
          valueHandler.GetValues( curve, iPt, out xVal, out lowVal, out yVal );

         string xStr = MakeValueLabel( curve.GetXAxis( pane ), xVal, iPt,
          curve.IsOverrideOrdinal );
         string yStr = MakeValueLabel( curve.GetYAxis( pane ), yVal, iPt,
          curve.IsOverrideOrdinal );

         this.pointToolTip.SetToolTip( this, "( " + xStr + ", " + yStr + " )" );

         //this.pointToolTip.SetToolTip( this,
         // curve.Points[iPt].ToString( this.pointValueFormat ) );
        }
       }

       this.pointToolTip.Active = true;
      }
     }
     else
      this.pointToolTip.Active = false;
    }
    else
     this.pointToolTip.Active = false;

    //g.Dispose();
   }
            lastObj = nearestObj; 
   return mousePt;
  }

 

具體其他優化與功能修改可自行發掘。

如果在ZedGraph中設置的是顯示最近曲線上的點的坐標,即

zgc.IsShowCursorValues = true;

 

那麼就要修改源碼的HandleCursorValues方法

同樣聲明一個類變數存儲上次獲得的點

private Point lastMovedPoint;

 

然後在方法中加上判斷並通過

this.pointToolTip.AutomaticDelay = 1000;

 

設置提示延遲1秒。最後再將當前點賦值給類變數。

lastMovedPoint = mousePt;

完整示例代碼

private Point HandleCursorValues( Point mousePt )
  {
            GraphPane pane = _masterPane.FindPane(mousePt);
            if (pane != null && pane.Chart._rect.Contains(mousePt) && !mousePt.Equals(lastMovedPoint))
            {
                // Provide Callback for User to customize the tooltips
                if (this.CursorValueEvent != null)
                {
                    string label = this.CursorValueEvent(this, pane, mousePt);
                    if (label != null && label.Length > 0)
                    {
                        this.pointToolTip.AutomaticDelay = 1000;
                        this.pointToolTip.SetToolTip(this, label);
                        this.pointToolTip.Active = true;
                    }
                    else
                    {
                        this.pointToolTip.Active = false;
                    }
                    lastMovedPoint = mousePt;
                }
                else
                {
                    double x, x2, y, y2;
                    pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);
                    string xStr = MakeValueLabel(pane.XAxis, x, -1, true);
                    string yStr = MakeValueLabel(pane.YAxis, y, -1, true);
                    string y2Str = MakeValueLabel(pane.Y2Axis, y2, -1, true);
                    this.pointToolTip.AutomaticDelay = 1000;
                    this.pointToolTip.SetToolTip(this, "( " + xStr + ", " + yStr + ", " + y2Str + " )");
                    this.pointToolTip.Active = true;
                }
               
            }
            else
                this.pointToolTip.Active = false;

            return mousePt;
           
  }

 

註:

這裡只著重修改當用戶重寫此事件的情況下,即this.CursorValueEvent != null時,具體情況可跟據自己需要進行修改。

ZedGraph5.1.5源碼與修改版源碼下載

關註公眾號:

霸道的程式猿

回覆:

ZedGraph源碼修改


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 使用C#編寫的Windows服務程式,在Winform中進行調用。 常用工具類方法檢測服務是否存在或者安裝,獲取服務狀態,啟動服務,停止服務的方法。 以在Winform中重啟服務為例。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公 ...
  • 開篇:zxing.net是.net平臺下編解條形碼和二維碼的工具。 首先創建新項目 選擇MVC模板 添加一個控制器 在項目引用中的引用ZXing 進行聯網下載 控制器需要引用 後臺控制器 public string TiaoXing(string name) { //設置條形碼規格 Encoding ...
  • 場景 點擊按鈕後打開視窗,點擊視窗的確定按鈕後即使窗體返回了Ok,此時不關閉窗體,將窗體隱藏。 再次點擊按鈕後,仍然打開上次的窗體。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載 ...
  • 前幾個星期在公司的測試伺服器上搭建了 Exceptionless 對公司的 Asp.net core 項目進行遙測。在之前都是遠程桌面登錄上去,然後去翻日誌文件看有沒有異常,效率極其的低。用了 Exceptionless 之後,效率高了不少,而且能收集到更多信息了。 最近準備要過年了,項目也上線了一 ...
  • 前言:因業務需要對WPF中的DataGrid控制項中的行數進行統計,同時把統計的行數顯示在列標題上。 如果我們用常規的Binding手段更新DataGridTextColunm的Header的話是不會生效的,因為WPF中視覺樹中沒有DataGridTextColumn元素來映射它(DataGridTe ...
  • 上一篇寫了《Entity Farmework領域建模方式 3種編程方式》,現在就Code First 繼續學習 1、資料庫表的創建 新建一個MVC的項目,在引用右擊管理NuGet程式包,點擊瀏覽搜索EF安裝,我這裡主要是EF6.0 以上的學習 所以都安裝6.0 以上的版本 接下來在Model文件夾下 ...
  • 在最近的開發過程中,應用了一些關於knockout的下拉項目。 關於下拉多選的開發在這裡做一個記錄。 下麵直接上代碼 添加的時候,無需給初始值 添加了一個觸發。根據部門獲得對應的崗位 後臺獲得對應的數據 編輯的時候,需要把對應綁定的值初始化 其他代碼都一樣,我這裡只給初始化的代碼 關於下拉多選(mu ...
  • 場景 在C#中檢索本地電腦所有服務時,使用 System.ServiceProcess.ServiceController[] services = System.ServiceProcess.ServiceController.GetServices(); 報錯 註: 博客主頁: https:/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...