带有固定显示区域的PlotCube和自定义的双击操纵器



我需要一个带有固定显示区域的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提供的对象,该对象是解雇事件的目标。这对应于图立方体的同步版本 - 用于渲染的同步版本。改用此方法,您的更改将正确显示。

相关内容

  • 没有找到相关文章

最新更新