使用Windows窗体的XNA - 打开新窗口

Hoe*_*loe 6 c# xna dialog panel winforms

好的,我们走了.我正在尝试创建一个应用程序,因为它的渲染器使用XNA作为基础.此项目中必需的一件事是打开一个新窗口(作为对话框),其中嵌入了一个单独的XNA渲染面板.我正在使用它作为交互式预览面板,所以我绝对需要XNA来渲染.然而,似乎XNA并没有很好地做到这一点.我自己尝试了各种各样的东西,但无济于事(产生错误,无法正确渲染,或渲染错误的宽高比等).通常情况下,我会在这里发布代码,但由于我运气不好,所以发布的内容并不多.

我的应用程序目前包含一个嵌入在Form中的XNA应用程序,我有一个按钮来打开预览面板,理论上它应该弹出一个包含XNA渲染器的Form对话框,以允许我绘制预览.我已经尝试了好几个小时,无处可去,所以我在这里要求一些帮助.

不管怎么说,还是要谢谢你.

编辑:好的,我已经取得了一些进展,但我有两个问题.首先,使用精灵批处理绘制的任何纹理都显示正确的尺寸,但是填充了纯黑色.此外,当我打开对话框,然后关闭它,并关闭应用程序时,我得到一个AccessViolationException.我强烈怀疑这两个错误是以某种方式联系在一起的.

这是我的代码初始化预览对话框.(a是一个自定义类,基本上由Texture2D对象的LinkedList组成).

 animPrev = new AnimationPreview(a);
 animPrev.Show();
Run Code Online (Sandbox Code Playgroud)

我的AnimationPreview类是Form类的扩展,包含一个PreviewControl对象,它是XNA Winforms示例中的GraphicsDeviceControl的扩展.请注意,由于各种原因,我的主窗体扩展了XNA Game类.

PreviewControl对象设置如下:

protected override void Initialize()
{
    sb = new SpriteBatch(GraphicsDevice);
    Application.Idle += delegate { Invalidate(); };
}
Run Code Online (Sandbox Code Playgroud)

Draw方法包含:

protected override void Draw()
{
    GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.Violet);
    if (frame != null)
    {
        sb.Begin();
        sb.Draw(Image, Vector2.Zero, Color.White);
        sb.End();
    }
 }
Run Code Online (Sandbox Code Playgroud)

这会像预期的那样清除紫罗兰色的背景,并绘制一个与Image相同大小的黑盒子.这不是预期的.希望有人可以帮助我.

注意:可接受的替代方法是将XNA Texture2D对象转换为System.Drawing.Image对象.但是,我使用XNA 3.1,所以我不能只将纹理保存到流并重新加载它.实际上,在尝试过这个之后,它有点狡猾,而且很慢,所以我宁愿不这样做.

Ron*_*Dex 0

您看过以下官方教程/示例吗?

他们应该解释我认为的一切。您甚至可以找到示例的可下载源代码。