ZedGraph如何检测放大或缩小

本文关键字:放大 缩小 检测 何检测 ZedGraph | 更新日期: 2023-09-27 18:09:41

我已经使用ZedGraph有一段时间了,但我只是在搜索了几个小时后感到沮丧,我找不到如何区分检测缩放事件是"放大"还是"缩小"还是"全部缩小"?

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

如果谁有主意,请帮我一下。

谢谢。

ZedGraph如何检测放大或缩小

早些时候,我通过检查zedGraphControl1.GraphPane.XAxis.Scale来检测放大或缩小。最大值小于图表中的点数。如果它更小,那么放大是有意的,反之亦然。然而,这并不是万无一失的,因为有时缩小会被检测为放大。

经过多次搜索,我发现是这样的:http://sourceforge.net/p/zedgraph/discussion/392232/thread/d33cfd8c/

因此,使用类似的技术,我通过计算所选区域来改进检测当用户使用左键单击并拖动(使用zedGraphControl1.GraphPane.XAxis.Scale的新值)放大时,缩放区域。Max和zedGraphControl1.GraphPane.XAxis.Scale。最小),并将该区域与整个图表的面积进行比较(使用zedGraphControl1.GraphPane.XAxis.Scale的先前值)。

像:

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

知道没有简单的方法来做到这一点真的很令人失望,但到目前为止,这工作得很好,因为用户选择的面积不能等于或大于图表面积。

根据我的理解,没有特定的选项可以找到放大/缩小或全部缩小,但有一个解决方案。

目前它只会显示它的状态....

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

希望对你有帮助。

我今天找到了一个解决办法。我把GraphPane变量作为form1中的全局变量,并添加了我自己的标志:

GraphPane myPane;
bool inv = false;

然后在构造函数中注册到ZedGraph控件的缩放事件:

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

对我来说,它工作完美。我在所有的缩放选项中都进行了测试放大和缩小,效果都很好