我已经使用 ZedGraph 有一段时间了,但是经过数小时的搜索后我感到很沮丧,我找不到如何区分缩放事件是“放大”、“缩小”还是“全部缩小”的检测方法?
实际上,我正在制作自己的放大和缩小版本,以便在每种情况下对特定数据进行采样,我真的需要找到一种方法来检测缩放事件的类型。
如果有人有想法,请帮助我。
谢谢。
早些时候,我通过检查 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;
}
}
知道没有简单的方法可以做到这一点真是令人失望,但到目前为止这工作正常,因为用户选择的区域不能等于或大于图表区域。
希望这可以帮助某人。
我今天找到了解决方案。我将 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();
}
}
对我来说,它工作得很好。我在任何缩放选项中对其进行了测试,所有缩放选项都可以缩小和缩小,并且可以正常工作。
据我了解,没有找到放大/缩小或全部缩小的特定选项,但有一个解决方法。
目前它只会说它是什么状态......
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
}
}
希望有帮助。