0

我正在尝试捕获不在可见树中的 WebBrowser 控件的内容,但 WriteableBitmap.Render() 正在捕获所有黑色像素的(大小正确)位图。如果我将 WebBrowser 放入可视化树中,则捕获工作正常。

WriteableBitmap 文档强调它适用于不在可视树中的控件,并且我正在对 Measure() 和 Arrange() 进行必要的调用。相关代码(最初在 WebBrowser_LoadCompleted 事件中,用于演示移至 renderButton_OnClick)

        hiddenBrowser.Measure(new Size(hiddenBrowser.Width, hiddenBrowser.Height));                // pretend there's plenty of space.
        hiddenBrowser.Arrange(new Rect(0.0, 0.0, hiddenBrowser.Width, hiddenBrowser.Height));     // pretend we know where this is going.
        //noHelp hiddenBrowser.UpdateLayout(); 

        WriteableBitmap _bitmap = new WriteableBitmap((int)theImage.Width, (int)theImage.Height);
        _bitmap.Render(hiddenBrowser, new ScaleTransform());
        _bitmap.Invalidate();
        theImage.Source = _bitmap;

演示该问题的完整项目位于:https ://skydrive.live.com/redir?resid=193BF22F5BBA1A84!10526&authkey=!AGeH6YC_NttOmj0

按 Unhide(webBrowser 显示在可视树中),然后按 Go,然后按 Render --> render captures OK。然后按 Hide(webBrowser 消失),然后按 Go,然后按 Render --> Black Screen of Ignorance。

最初,我认为这是一个时间问题(例如,即使 LoadComplete 事件触发,浏览器可能还没有完成网页绘制),但事实并非如此;在演示中,我等待 10 秒,然后按下执行渲染的“渲染”按钮,但仍然得到黑色图像。

4

2 回答 2

0

事实证明,这从一开始就注定了。

您不能在 WP8 的后台运行 WebBrowser 控件,期间。这是一个不受支持的 API。而且,如上所述,无论如何,当 WebBrowser 不在可视树中时,它不会提供位图(可能不是错误?)。

于 2013-09-13T18:17:59.830 回答
0

我重现了你的问题。如果没有必要,似乎不会呈现控件。
你真的需要WebBrowser在可视化树中吗?
如果您只是希望它不可见,则将其设置VisibilityCollapsed也不起作用(我尝试过)。

一个使 WebBrowser 对用户不可见但仍允许WriteableBitmap渲染的丑陋技巧是将控件从 ViewPort 中转换出来。为此,只需使用TranslateTransform

hiddenBrowser = new WebBrowser();
hiddenBrowser.Width = theImage.Width;
hiddenBrowser.Height = theImage.Height;
hiddenBrowser.LoadCompleted += hiddenBrowser_LoadCompleted;
hiddenBrowser.NavigationFailed += hiddenBrowser_NavigationFailed;
hiddenBrowser.LayoutUpdated += hiddenBrowser_LayoutUpdated;
hiddenBrowser.RenderTransform = new TranslateTransform { X = 2000, Y = 2000 }; // this is the code I added.

丑陋但有效的解决方案!

于 2013-09-12T20:21:35.127 回答