C# XNA与Windows窗体-打开新窗口

C# XNA与Windows窗体-打开新窗口,c#,winforms,dialog,xna,panel,C#,Winforms,Dialog,Xna,Panel,好了,我们开始吧。我正试图制作一个应用程序,使用XNA作为基础,因为它的渲染器。在这个项目中,需要打开一个新窗口(作为对话框),其中嵌入了一个单独的XNA渲染面板。我使用它作为一个交互式预览面板,所以我绝对需要XNA在其中渲染。然而,XNA似乎没有很好的设备来完成这项工作。我自己也尝试过各种方法,但都没有成功(要么产生错误,要么渲染不正确,要么渲染的纵横比不正确,等等)。通常,我会在这里发布代码,但因为我运气不好,所以没有太多东西可以发布 我的应用程序目前包含一个嵌入表单中的XNA应用程序,我有

好了,我们开始吧。我正试图制作一个应用程序,使用XNA作为基础,因为它的渲染器。在这个项目中,需要打开一个新窗口(作为对话框),其中嵌入了一个单独的XNA渲染面板。我使用它作为一个交互式预览面板,所以我绝对需要XNA在其中渲染。然而,XNA似乎没有很好的设备来完成这项工作。我自己也尝试过各种方法,但都没有成功(要么产生错误,要么渲染不正确,要么渲染的纵横比不正确,等等)。通常,我会在这里发布代码,但因为我运气不好,所以没有太多东西可以发布

我的应用程序目前包含一个嵌入表单中的XNA应用程序,我有一个按钮打开预览面板,理论上它应该作为一个表单对话框弹出,其中包含XNA渲染器,以允许我绘制预览。我已经试了好几个小时了,结果一无所获,所以我在这里请求一些帮助

无论如何,谢谢你

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

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

My AnimationPreview类是Form类的扩展,包含PreviewControl对象,它是XNA Winforms示例中GraphicsDeviceControl的扩展。注意,出于各种原因,我的主窗体扩展了XNA游戏类

PreviewControl对象的设置如下:

protected override void Initialize()
{
    sb = new SpriteBatch(GraphicsDevice);
    Application.Idle += delegate { Invalidate(); };
}
绘制方法包括:

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();
    }
 }
这将按预期清除紫色表单的背景,并绘制一个与图像大小相同的黑框。这是预料不到的。希望有人能帮我

注:可接受的替代方案是将XNA Texture2D对象转换为System.Drawing.Image对象。但是,我使用的是XNA3.1,所以我不能将纹理保存到流并重新加载。
事实上,在尝试了这个方法之后,它有点狡猾,而且速度非常慢,所以我不想这样做。

你看了下面的官方教程/示例了吗


他们应该解释我认为的一切。您甚至可以找到样本的可下载源。

您是否正在使用?(因为,如果不是,那就是第一步。)不,我来看看。嗯。。。这似乎就是我想要的,但它有一个问题,它似乎不包含更新循环。目前我的主要表单是一个游戏类,其句柄被转换为表单对象。我需要在这个新窗口中使用更新和绘制循环。好的。。。它似乎只允许创建一个大小的图形设备,这对我来说是个问题。我会仔细调查的,等等!我想我明白了。我使用这个GraphicsDeviceControl创建了一个“PreviewControl”,然后将其嵌入到PreviewWinForm中。似乎有用。。。
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();
    }
 }