Мне нужно захватить образ сгенерированного HTML. Я использую отличное решение от Alex Filipovici отсюда: Convert HTML string to image. Он отлично работает, за исключением случаев, когда я пытаюсь загрузить страницу с iframe, которая использует некоторый Javascript для загрузки.WebBrowser Control DocumentCompleted после завершения iframe и Javascript
static int width = 1024; static int height = 768; public static void Capture() { var html = @" <!DOCTYPE html> <meta http-equiv='X-UA-Compatible' content='IE=Edge'> <html> <iframe id='forecast_embed' type='text/html' frameborder='0' height='245' width='100%' src='http://forecast.io/embed/#lat=42.3583&lon=-71.0603&name=Downtown Boston'> </iframe> </html> "; StartBrowser(html); } private static void StartBrowser(string source) { var th = new Thread(() => { var webBrowser = new WebBrowser(); webBrowser.Width = width; webBrowser.Height = height; webBrowser.ScrollBarsEnabled = false; webBrowser.DocumentCompleted += webBrowser_DocumentCompleted; webBrowser.DocumentText = source; Application.Run(); }); th.SetApartmentState(ApartmentState.STA); th.Start(); } static void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { var webBrowser = (WebBrowser)sender; using (Bitmap bitmap = new Bitmap(width, height)) { webBrowser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height)); bitmap.Save(@"image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); } Application.Exit(); }
Я понимаю, что, наверное, не окончательный способ узнать, если все в JavaScript закончились и капризы Iframe нагрузки и тот факт, что DocumentCompleted получить Называется столько раз, сколько кадров/плавающие фреймы + 1. Я могу справиться с загрузкой iframe с помощью счетчика или что-то в этом роде, но все, что я хочу, является разумной задержкой, поэтому загружается javascript, и я не получаю изображение с «Загрузка» в нем следующим образом: http://imgur.com/FiFMTmm
Куда вы включили бы мой таймер? Для меня было бы достаточно простой задержки. – naveed
@naveed, вы можете изменить подпись обработчика события 'webBrowser_DocumentCompleted' как' async static void webBrowser_DocumentCompleted ...'. Затем добавьте 'await Task.Delay (1000)' в качестве первой строки внутри 'webBrowser_DocumentCompleted'. Альтернативно, без 'async/await', создайте таймер внутри' webBrowser_DocumentCompleted' и переместите всю логику из 'webBrowser_DocumentCompleted' в обработчик событий таймера. Одна вещь, о которой нужно знать в любом случае, ** 'DocumentCompleted' может быть запущена несколько раз для того же документа ** (из-за кадров). Для уменьшения этого используйте переменную статического флага. – Noseratio
Удивительный! Это сработало! Спасибо Noseratio. – naveed