同一ILScene中的多个ILPlotCube独立于鼠标交互作用.记录示例
here.
我的每个PlotCube都包含一个LinePlot,我需要保持两个PlotCube的X轴对齐.因此,当一个PlotCube中的X轴由于鼠标交互而改变时,需要一个事件通知我.
在文档或搜索引擎中找不到任何内容.用鼠标事件进行了一些有限的测试(复杂,可能吗?).找到了ILAxisChangedEventArgs类,但没有发生任何事件.
最佳答案 请改用ILPlotCube.Limits! ILLimits类管理plotcube的轴限制.它提供Changed事件.您可以使用它来反映其他绘图立方体的更改.
private void ilPanel1_Load_1(object sender, EventArgs e) {
// just some data
ILArray<float> A1 = new float[] { 1,4,3,2,5 };
// setup new plot cube
var pc1 = ilPanel1.Scene.Add(new ILPlotCube("pc1") {
ScreenRect = new RectangleF(0,0,1,.6f)
});
// 2nd plot cube
ILArray<float> A2 = new float[] { -1,-4,-3,-2,4 };
var pc2 = ilPanel1.Scene.Add(new ILPlotCube("pc2") {
ScreenRect = new RectangleF(0, .4f, 1, .6f)
});
// add line plots to the plot cubes
pc1.Add(new ILLinePlot(A1));
pc2.Add(new ILLinePlot(A2));
// Synchronize changes to the limits property
// NOTE: mouse interaction is fired on the SYNCHRONIZED COPY
// of the plot cube, which is maintained for each individual ILPanel!
pc1 = ilPanel1.SceneSyncRoot.First<ILPlotCube>("pc1");
pc2 = ilPanel1.SceneSyncRoot.First<ILPlotCube>("pc2");
pc1.Limits.Changed += (_s, _a) => { SynchXAxis(pc1.Limits, pc2.Limits); };
pc2.Limits.Changed += (_s, _a) => { SynchXAxis(pc2.Limits, pc1.Limits); };
}
private void SynchXAxis(ILLimits lim1, ILLimits lim2) {
// synch x-axis lim1 -> lim2
Vector3 min = lim2.Min;
Vector3 max = lim2.Max;
min.X = lim1.XMin; max.X = lim1.XMax;
// disable eventing to prevent from feedback loops
lim2.EventingSuspend();
lim2.Set(min, max);
lim2.EventingStart(); // discards Changed events
}
现在,当您使用鼠标缩放/平移时,对一个绘图立方体的更改将转移到另一个绘图立方体.这仅作用于X轴.其他限制不会受到影响.
两个提示
1)请记住,鼠标交互不会影响您创建的原始绘图立方体对象,而是更改它的同步副本.该副本由ILPanel内部维护,可防止多线程问题以及对一个实例的更改,从而填充回其他面板中可能存在的其他实例.为了了解这些更改,您必须连接到同步副本的事件处理程序. ILPanel.SceneSynchRoot为您提供访问权限.
2)当将更改从一个绘图立方体的限制转移到另一个绘图立方体时,应禁用目标限制对象上的事件.否则,它将触发另一个Changed事件,事件将无休止地触发. ILLimits.EventingStart()函数在您的更改后重新启用事件并丢弃到目前为止累积的所有事件.