Открытие веб-браузера внутри проекта XNA? - PullRequest
2 голосов
/ 13 января 2011

У меня есть игра XNA, которая открывает форму окна, содержащую веб-браузер.

Каждый раз, когда я открываю форму, она показывает следующую ошибку:

    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?Контроль

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Нужно ли иметь возможность показывать справку на Xbox или только в Windows?Чтобы заставить его работать в Windows, просто добавьте атрибут [STAThread] к вашей функции Main() в Program.cs:

[STAThread]
static void Main(string[] args)
{
    ...
}

См. http://blogs.msdn.com/b/oldnewthing/archive/2008/04/24/8420242.aspx для справки о моделях STA и MTA.

1 голос
/ 13 января 2011

В зависимости от вашей целевой платформы вы можете использовать Awesomium с оболочкой .net для визуализации ваших HTML-файлов в игре.

1 голос
/ 13 января 2011

Вы пробовали просто запустить файл справки через

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

Это откроет ваш HTML-файл в любой программе, которую пользователь по умолчанию настроил на своем ПК для просмотра HTML-файлов. (вам нужно заменить путь в приведенном выше коде на путь к вашему фактическому файлу HTML).

Поскольку вы говорите, что должны отображать его в игре, я думаю, что единственным вариантом для вас будет попытаться открыть форму в ее собственной ветке.

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

  helpThread.Start(); 

Надеюсь, я получил правильный синтаксис для этого, но попробуйте и посмотрите, даст ли это желаемый результат. Я думаю, что вы столкнулись с проблемой, потому что вы не можете запустить WinForm из потока игрового цикла. Это на самом деле не предназначено для поддержки этого. Так что запускать его в новой ветке может помочь вам обойти это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...