在LinqPad中使用ILNumerics绘制麻烦 - ILPanel认为它处于设计模式

时间:2013-07-03 01:24:36

标签: linqpad ilnumerics

我在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认为它没有在设计模式下呈现?

2 个答案:

答案 0 :(得分:1)

是的,你可以在LINQPad中渲染WPF控件 - 使用PanelManager.DisplayWpfElement(或者只是通过转储它)。

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

我不知道是否有可能欺骗ILNumerics认为它不在设计模式中。在ILNumerics.Drawing.ILHelper.IsDesignMode处查看Reflector。它正在做引用程序集的狡猾。我不知道为什么他们不只是检查控件的DesignMode属性 - 这是正常的做法。

答案 1 :(得分:1)

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

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

  • 让LinqPad依赖于ILNumerics。可能不是最好的解决方案。
  • 补丁ILNumerics:改变Joe Albahari提到的帮助方法返回false。

第二个“技巧”可能会引导我们未来的解决方案。我不知道,如果“普通”DesignMode属性与LinqPad一起工作吗?也许我们可以将现有方法与所有不常见情况的设置开关结合起来。