WebBrowser в XNA 4.0 не работает - PullRequest
       13

WebBrowser в XNA 4.0 не работает

2 голосов
/ 04 октября 2011

Я пытался заставить WebBrowser рисовать на текстуру в XNA 4.0, и я нашел несколько руководств о том, как это сделать. Проблема в том, что когда я пытаюсь это реализовать, меняю ли я свойство Url или вызываю Navigate(), он просто не загружает страницу. У меня такое чувство, что я немного не осведомлен о требуемой поточной обработке, поскольку мой проект не запускается как поток STA, поэтому я создаю отдельный поток для запуска веб-браузера и рендеринга в растровое изображение.

Вот как я начинаю:

public void LoadTexture(GraphicsDevice gfx, ContentManager content, string filename, float duration = -1f)
{
    this.gfx = gfx;
    this.filename = filename;
    this.duration = duration;

    _resetEvent = new AutoResetEvent(false);
    Thread thread = new Thread(GetWebScreenshot);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    _resetEvent.WaitOne();
}

А вот и GetWebScreenshot:

* * 1010

Свойство ReadyState никогда не меняется с Uninitialized, я также пытался использовать событие DocumentReady, и оно никогда не срабатывает. Я также пробовал Join() вместо AutoResetEvent, но, похоже, ничего не работает.

1 Ответ

2 голосов
/ 05 октября 2011

Я был прав, это было невежество с моей стороны.Критическая вещь в элементах управления ActiveX и Single Threaded Apartments состоит в том, что очередь сообщений должна быть прокачана.Итак, теперь я перестроил свой код следующим образом:

public void LoadTexture(GraphicsDevice gfx, ContentManager content, string filename, float duration = -1f)
{
    this.gfx = gfx;
    this.filename = filename;
    this.duration = duration;

    Thread thread = new Thread(GetWebScreenshot);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

public void GetWebScreenshot()
{
    this.web = new WebBrowser();
    this.web.Size = new Size(gfx.Viewport.Width, gfx.Viewport.Height);
    this.web.Url = new Uri(this.filename);
    this.web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted);
    Application.Run(); // Starts pumping the message queue (and keeps the thread running)
}

void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    Bitmap bitmap = new Bitmap(this.gfx.Viewport.Width, this.gfx.Viewport.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    this.web.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height));
    this.texture = HTMLTextureFactoryMachine.BitmapToTexture2D(this.gfx, bitmap);
    Application.ExitThread(); // Exits the thread
}

Это не проблема.

...