1

我需要一个具有固定显示区域的 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())。这按预期工作,但它不是最终的解决方案。

有没有人有想法,怎么了?

4

1 回答 1

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该对象是触发事件的目标。这对应于绘图立方体的同步版本 - 用于渲染的版本。改用它,您的更改将正确显示。

于 2014-02-11T10:42:57.250 回答