2011-01-13 38 views
2

我有XNA游戏,打开一个包含webBrowser的窗口窗体。在XNA项目中打开webBrowser?

每次我打开它让我看到下面的错误形式:

System.Threading.ThreadStateException was unhandled 
    Message=ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment. 
    Source=System.Windows.Forms 
    StackTrace: 
     at System.Windows.Forms.WebBrowserBase..ctor(String clsidString) 
     at System.Windows.Forms.WebBrowser..ctor() 
     at GameOfLifeV2._0.Help.InitializeComponent() in C:\Users\Gilad\Documents\C# projects\GameOfLifeV2.0\GameOfLifeV2.0\GameOfLifeV2.0\Help.Designer.cs:line 33 
     at GameOfLifeV2._0.Help..ctor() in C:\Users\Gilad\Documents\C# projects\GameOfLifeV2.0\GameOfLifeV2.0\GameOfLifeV2.0\Help.cs:line 17 
     at GameOfLifeV2._0.Game.RespondKeyboard(KeyboardState state) in C:\Users\Gilad\Documents\C# projects\GameOfLifeV2.0\GameOfLifeV2.0\GameOfLifeV2.0\Game.cs:line 111 
     at GameOfLifeV2._0.Game.Update(GameTime gameTime) in C:\Users\Gilad\Documents\C# projects\GameOfLifeV2.0\GameOfLifeV2.0\GameOfLifeV2.0\Game.cs:line 68 
     at Microsoft.Xna.Framework.Game.Tick() 
     at Microsoft.Xna.Framework.Game.HostIdle(Object sender, EventArgs e) 
     at Microsoft.Xna.Framework.GameHost.OnIdle() 
     at Microsoft.Xna.Framework.WindowsGameHost.RunOneFrame() 
     at Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(Object sender, EventArgs e) 
     at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(Int32 grfidlef) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at Microsoft.Xna.Framework.WindowsGameHost.Run() 
     at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun) 
     at Microsoft.Xna.Framework.Game.Run() 
     at GameOfLifeV2._0.Program.Main(String[] args) in C:\Users\Gilad\Documents\C# projects\GameOfLifeV2.0\GameOfLifeV2.0\GameOfLifeV2.0\Program.cs:line 15 
    InnerException: 
以下行

this.InfoBrowsersd = new System.Windows.Forms.WebBrowser(); 

解决方案将受到欢迎:)

替代问题: 有没有更好的方法来显示帮助文档,然后创建HTML文件并在webBrowser控件中显示它们?

回答

1

你有没有尝试过通过

System.Diagnostics.Process.Start("c:\...\MyHelpFile.html") 

这将在用户有任何程序设置打开HTML文件默认情况下,在其PC上查看HTML文件,推出了帮助文件。 (您必须将上述代码中的路径替换为实际HTML文件的路径)。因为你说你必须在游戏中显示它,所以我认为你唯一的选择是尝试在自己的线程中打开表单。

Thread helpThread = new Thread(new ThreadStart(delegate() { 
    this.InfoBrowsersd = new System.Windows.Forms.WebBrowser(); 
    })); 

    helpThread.Start(); 

希望我的语法正确,但试试看看是否给你你想要的结果。我认为你遇到了一个问题,因为你无法从游戏循环线程中启动WinForm。它的设计并不是为了支持这一点。因此,在新线程中启动它可能会帮助您避开它。

+0

我需要将浏览器植入程序中。 – 2011-01-13 20:33:50

+1

哦,好吧,我用另一个建议更新了我的答案。我没有机会尝试它,但似乎像这样的事情可能会起作用。 – 2011-01-13 20:46:25