我需要一个带有固定显示区域的Plotcube和一个恢复此视图的双击处理程序。为之
:
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 Handler,上面的代码和一条额外的行重置旋转:
:
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的函数上(而不是函数调用reset Reset())。这是按预期工作的,但不能是最终解决方案。
有人有什么想法,怎么了?
鼠标事件处理程序通常在 global 场景上注册。每个面板/驱动程序都会创建自己的该场景的同步副本,以便之后渲染。用户与同步副本进行旋转,平底锅等进行交互,这是发射事件处理程序的同步副本。
但是,由于自定义事件处理程序已在全局场景上已注册,因此在全局场景中的节点对象上,处理程序功能将被执行。因此,应该始终使用事件处理程序提供的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
提供的对象,该对象是解雇事件的目标。这对应于图立方体的同步版本 - 用于渲染的同步版本。改用此方法,您的更改将正确显示。