2

我在 LinqPad 中使用 ILNumerics 时遇到了一些问题。我在 LinqPad 中有以下代码:

void Main()
{
    var scene = new ILScene {
        new ILPlotCube(twoDMode: false) {
            new ILSurface(ILSpecialData.sincf(40, 60, 2.5f)) {
                Wireframe = { Color = Color.FromArgb(50, Color.LightGray) },
                Colormap = Colormaps.Jet
            }
        }
    };

    scene.First<ILPlotCube>().Rotation = Matrix4.Rotation(new Vector3(1f, 0.23f, 1f), 0.7f);
    scene.Camera.Add(new ILSphere());

    var panel = new ILPanel { Scene = scene };

    PanelManager.DisplayControl(panel);
}

此代码在“自定义”linqpad 选项卡中生成一个蓝色大圆圈(中间带有文本“ILNumerics ILPanel (OpenGL)”)。linqpad 中的“结果”选项卡包含以下文本:

Determining Design Mode...
 Entry Assembly: (null)
 CurrentTypeAssembly: ILNumerics32, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null
 Loaded Assemblies:

Design Mode: True

问题:

  1. 是否可以将其呈现为 WPF 元素而不是 WinForms 控件?(我想这会成功渲染情节)
  2. 或者; 是否有可能“欺骗”ILPanel 认为它没有在设计模式下呈现?
4

2 回答 2

1

是的,您可以在 LINQPad 中呈现 WPF 控件 - 通过使用PanelManager.DisplayWpfElement(或仅通过转储它)。

不过,我认为它不会对您有所帮助,因为 ILNumerics 仅使用 Windows 窗体。它不引用任何 WPF 库。

我不知道是否可以欺骗 ILNumerics 使其认为它不在设计模式中。在反射器中查看ILNumerics.Drawing.ILHelper.IsDesignMode。它对引用的程序集做了一些狡猾的事情。我不知道他们为什么不只检查控件的 DesignMode 属性——这是正常的做法。

于 2013-07-03T03:33:41.333 回答
1

1) ILNumerics 仅针对 Winforms。但是您可以尝试使用 WPF WindowsFormsHost 容器吗?我没有任何经验,但不希望您的情况有所改善。

2) ILNumerics 现在检查 DesignMode 的方式:如果正在执行的程序集 (ILNumerics.dll) 不在入口程序集 (LinqPad) 的引用列表中,则考虑 DesignMode。因此,我可以看到 2 个“技巧”:

  • 使 LinqPad 依赖于 ILNumerics。虽然可能不是最好的解决方案。
  • 补丁 ILNumerics:更改 Joe Albahari 引用的辅助方法以改为返回 false。

第二个“技巧”可能会引导我们找到未来的解决方案。我不知道,“正常”的 DesignMode 属性是否也可以与 LinqPad 一起使用?也许我们可以将现有方法与所有不常见情况的设置开关结合起来。

于 2013-07-03T10:23:17.590 回答