2013-04-18 165 views
2

我一直在使用ZedGraph一段時間,但我只是在經過幾個小時的搜索後感到沮喪,我找不到如何區分檢測縮放事件是「放大」還是「縮小」或「全部縮小?」ZedGraph如何檢測放大或縮小?

其實我只是製作我自己的放大和縮小版本,以便在每種情況下采樣特定數據,而且我真的需要找到一種方法來檢測縮放事件的類型。幫我出

謝謝

回答

0

根據我的理解,沒有指定c選項來查找放大/縮小或縮小全部,但有一個解決這個問題。

目前它只會說明它是什麼狀態...。

private void zedGraphControl1_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState) 
    { 
     if(newState.Type == ZoomState.StateType.Pan){ } 
     else if (newState.Type == ZoomState.StateType.Zoom){ } 
     else if (newState.Type == ZoomState.StateType.Scroll){ } 
     else if (newState.Type == ZoomState.StateType.WheelZoom){ } 
    } 

如果添加上下文菜單生成器(zedGraphControl1_ContextMenuBuilder)的事件處理程序,並添加以下代碼以及。

bool isSubscriptionEnabled = false; 

    private void zedGraphControl1_ContextMenuBuilder(ZedGraphControl sender, ContextMenuStrip menuStrip, Point mousePt, ZedGraphControl.ContextMenuObjectState objState) 
    { 
     // Remove default options 
     menuStrip.Items.RemoveByKey("unzoom"); 
     menuStrip.Items.RemoveByKey("undo_all"); 

     // custom context menu items 
     ToolStripMenuItem unZoom_toolStripMenuItem = new ToolStripMenuItem(); 
     ToolStripMenuItem unZoomAll_toolStripMenuItem = new ToolStripMenuItem(); 

     // 1.Un Zoom 
     unZoom_toolStripMenuItem.Name = "unZoom"; 
     unZoom_toolStripMenuItem.Tag = "unzoom"; 
     unZoom_toolStripMenuItem.Text = "Un Zoom*"; 

     // 2.Undo All Zoom/Pan 
     unZoomAll_toolStripMenuItem.Name = "undoZoomAll"; 
     unZoomAll_toolStripMenuItem.Tag = "undozoomall"; 
     unZoomAll_toolStripMenuItem.Text = "Undo All Zoom/Pan*"; 

     // Add the above 2 menu strip items 
     menuStrip.Items.Insert(4, unZoom_toolStripMenuItem); 
     menuStrip.Items.Insert(5, unZoomAll_toolStripMenuItem); 

     if (!isSubscriptionEnabled) 
     { 
      // The following event handler help us to notify user click event on context menu 
      menuStrip.ItemClicked += new ToolStripItemClickedEventHandler(menuStrip_ItemClicked); 
      isSubscriptionEnabled = true; 
     } 
    } 

    private void menuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 
     if (e.ClickedItem.ToString() == "Un Zoom*") 
     { 
      // Add your custom task 
      MessageBox.Show("Un Zoom"); 

     } 
     else if (e.ClickedItem.ToString() == "Undo All Zoom/Pan*") 
     { 
      // Add your custom task 
     }    
    } 

希望有所幫助。

+0

感謝您的回覆,但儘管我們可以檢測到用戶何時從上下文菜單中單擊取消縮放或取消縮放全部,但只有在縮放事件處理程序被調用後纔會調用該事件處理程序代碼。所以我們無法使用此代碼檢測放大或縮小。 – Xichan 2013-04-19 12:16:48

4

之前我通過檢查zedGraphControl1.GraphPane.XAxis.Scale.Max值是否小於圖表中的點數來檢測放大或縮小。如果它的縮放比較小,反之亦然。然而,這不是糊弄的證據,因爲有時候變焦出被檢測爲變焦

經過一番搜索所有我發現了這一點: http://sourceforge.net/p/zedgraph/discussion/392232/thread/d33cfd8c/

所以使用類似的技術我通過計算面積提高了檢測當用戶使用左鍵單擊並拖動時(使用zedGraphControl1.GraphPane.XAxis.Scale.Max和zedGraphControl1.GraphPane.XAxis.Scale.Min的新值)並將該區域與該區域進行比較時,所選的 縮放區域整個圖表(使用以前的值zedGraphControl1.GraphPane.XAxis.Scale.Max和zedGraphControl1.GraphPane.XAxis.Scale.Min)。

喜歡這裏:

private void zedGraphControl1_ZoomEvent(ZedGraphControl sender, ZoomState oldState, ZoomState newState) 
{ 

    if (((lastYAxisMax - lastYAxisMin) * (lastXAxisMax - lastXAxisMin)) > ((sender.GraphPane.XAxis.Scale.Max - sender.GraphPane.XAxis.Scale.Min) * (sender.GraphPane.YAxis.Scale.Max - sender.GraphPane.YAxis.Scale.Min))) 
    { 
     zoomIn = true; 
     zoomOut = false; 
    } 
    else 
    { 
     zoomIn = false; 
     zoomOut = true; 
    } 
} 

這的確是令人失望的要知道,有沒有簡單的方法來做到這一點,但到目前爲止,這是工作的罰款,因爲用戶選擇的區域不能等於或大於圖表區域更大。

希望這可以幫助別人。

+0

我並不需要它,但我喜歡這裏的創造力+1 – chouaib 2014-01-29 05:35:50

0

我今天找到了解決方案。 我拿出GraphPane變量是在Form1全局變量,也增加了我自己的一個標誌:在構造函數中我註冊到ZedGraph控制的變焦事件

GraphPane myPane; 
bool inv = false; 

然後:

zedGraphControl1.ZoomEvent += new ZedGraphControl.ZoomEventHandler(MyZoomEvent); 

這是縮放事件代碼:

private void MyZoomEvent(ZedGraphControl control, ZoomState oldState, 

        ZoomState newState) 
     { 
      inv = myPane.IsZoomed; 
     } 

現在我有CreateGraph方法在我來說,我把它從計時器滴答事件每秒在這個方法中我檢查我的國旗是虛假或真實的:

private void CreateGraph(ZedGraphControl z1) 
     { 
      myPane = z1.GraphPane; 
      if (myPane != null) 
      { 
       myPane.CurveList.Clear(); 
       myPane.GraphObjList.Clear(); 
       myPane.Title.Text = "Histograms"; 
       myPane.XAxis.Title.Text = "Bar Number"; 
       myPane.YAxis.Title.Text = "Value"; 

       myPane.XAxis.Scale.MaxAuto = false; 
       myPane.XAxis.Scale.MinAuto = false; 
       myPane.YAxis.Scale.MaxAuto = false; 
       myPane.YAxis.Scale.MinAuto = false; 

       myPane.XAxis.Scale.Min = 0; 
       myPane.XAxis.Scale.Max = 255; 
       myPane.YAxis.Scale.Min = 0; 
       myPane.YAxis.Scale.Max = 255; 

       PointPairList list = new PointPairList(); 


       for (int i = 0; i < Core.graphValues.Count; i++) 
       { 
        double x = (double)i; 
        double y = (double)Core.graphValues[i]; 
        double z = 0; 
        list.Add(x, y, z); 
       } 
       LineItem myCurve = myPane.AddCurve("Top 1000 Averages", 
       list, Color.Red, SymbolType.None); 

       if (inv != true) 
       { 
        z1.Invalidate(); 
       } 
       z1.AxisChange(); 
      } 

     } 

對我來說這是完美的。 我在任何縮放選項中都測試過它全部放大和縮小,它正在工作。