ZedGraph如何检测放大或缩小?

时间:2013-04-18 07:35:28

标签: c# events charts zoom zedgraph

我一直在使用ZedGraph一段时间,但是经过数小时的搜索后我感觉很沮丧如果缩放事件是“放大”或“缩小”还是“全部缩小?”我无法找到如何区分检测? / p>

实际上我在每种情况下制作我自己的放大和缩小版本来采样特定数据,我真的需要找到一种方法来检测缩放事件的类型。

如果有人有想法,请帮助我。

感谢。

3 个答案:

答案 0 :(得分: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;
    }
}

知道没有简单的方法可以做到这一点真的很令人失望但是到目前为止这个工作正常,因为用户选择的区域不能等于或大于图表区域。

希望这有助于某人。

答案 1 :(得分:0)

根据我的理解,找不到放大/缩小或全缩放的具体选项,但有一个解决方法。

目前只会说它是什么状态......

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){ }
    }

如果为Context Menu Builder添加事件处理程序(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
        }            
    }

希望有所帮助。

答案 2 :(得分:0)

我今天找到了解决方案。 我将GraphPane变量取出为form1中的全局变量,并添加了我自己的标志:

GraphPane myPane;
bool inv = false;

然后在构造函数中,我注册到ZedGraph控件的zoom事件:

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();
            }

        }

对我而言,这是完美的。 我在任何缩放选项中对它进行了测试,所有缩放都在缩小和缩小,并且它正在工作。