2

我已经使用 ZedGraph 有一段时间了,但是经过数小时的搜索后我感到很沮丧,我找不到如何区分缩放事件是“放大”、“缩小”还是“全部缩小”的检测方法?

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

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

谢谢。

4

3 回答 3

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

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

希望这可以帮助某人。

于 2013-04-19T12:34:04.143 回答
0

我今天找到了解决方案。我将 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 方法,我在这个方法中每秒从一个计时器滴答事件中调用它,我检查我的标志是 false 还是 true:

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

        }

对我来说,它工作得很好。我在任何缩放选项中对其进行了测试,所有缩放选项都可以缩小和缩小,并且可以正常工作。

于 2014-05-24T21:44:48.460 回答
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
        }            
    }

希望有帮助。

于 2013-04-18T09:24:03.983 回答