我需要一个具有固定显示区域的Plotcube和一个用于恢复此视图的双击处理程序。 为此我从ILPlotcude派生了一个类,并在其构造函数中设置以下代码来设置限制:
:
float max = 1000f;
Limits.YMax = max;
Limits.XMax = max;
Limits.ZMax = max;
Limits.YMin = -max;
Limits.XMin = -max;
Limits.ZMin = -max;
AspectRatioMode = AspectRatioMode.MaintainRatios;
:
我还在这个类中安装了一个带有上面代码的doubleClick处理程序和一个用于重置旋转的附加行:
:
if (args.Cancel) return;
if (!args.DirectionUp) return;
Rotation = Matrix4.Identity;
float max = 1000f;
Limits.YMax = max;
Limits.XMax = max;
Limits.ZMax = max;
Limits.YMin = -max;
Limits.XMin = -max;
Limits.ZMin = -max;
AspectRatioMode = AspectRatioMode.MaintainRatios;
args.Refresh = true;
args.Cancel = true;
:
处理程序已执行但没有任何反应。出于测试目的,我将相同的代码直接放入基类ILPlotCube的函数OnMouseDoubleClick(而不是函数调用reset())。 这可以按预期工作,但它不能是最终的解决方案。
有没有人有想法,有什么不对?
答案 0 :(得分:0)
鼠标事件处理程序通常在全局场景中注册。每个面板/驱动程序创建自己的该场景的同步副本,然后进行渲染。用户与同步副本进行交互以进行旋转,平移等。它是同步副本,用于触发事件处理程序。
但由于自定义事件处理程序已在全局场景中注册,因此处理程序函数将在全局场景中的节点对象上执行。因此,应始终使用事件处理程序提供的sender
对象来访问场景节点对象。
此示例将在公共(全局)场景中包含的第一个绘图立方体对象上注册鼠标处理程序。处理程序会将场景重置为某个自定义视图:
ilPanel1.Scene.First<ILPlotCube>().MouseDoubleClick += (s,a) => {
// we need the true target of the event. This may differs from 'this'!
var plotcube = s as ILPlotCube;
// The event sender is modified:
plotcube.Rotation = Matrix4.Identity;
float max = 1000f;
plotcube.Limits.YMax = max;
plotcube.Limits.XMax = max;
plotcube.Limits.ZMax = max;
plotcube.Limits.YMin = -max;
plotcube.Limits.XMin = -max;
plotcube.Limits.ZMin = -max;
plotcube.AspectRatioMode = AspectRatioMode.MaintainRatios;
// disable the default double click handler which would reset the scene
a.Cancel = true;
// trigger a redraw of the scene
a.Refresh = true;
};
在处理程序中,我们可以通过ilPanel.Scene.First<ILPlotCube>()...
获取对某个场景对象的引用。但相反,我们采用s
提供的对象,它是被触发事件的目标。这对应于绘图立方体的同步版本 - 用于渲染的版本。请改用它,您的更改将正确显示。