Windows phone 8 WriteableBitmap.Render()控件不在可视树中时未捕获(改为所有黑色像素)

Windows phone 8 WriteableBitmap.Render()控件不在可视树中时未捕获(改为所有黑色像素),windows-phone-8,webbrowser-control,Windows Phone 8,Webbrowser Control,我试图捕获不在可见树中的WebBrowser控件的内容,但WriteableBitmap.Render()正在捕获所有黑色像素的(大小正确的)位图。如果我将WebBrowser放入可视化树中,捕获效果会很好 WriteableBitmap文档强调它可以在可视化树以外的控件上工作,我正在对Measure()和Arrange()进行必要的调用。相关代码(最初在WebBrowser_LoadCompleted事件中,用于将演示移动到renderButton_OnClick) 演示该问题的完整项目可从以

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

WriteableBitmap文档强调它可以在可视化树以外的控件上工作,我正在对Measure()和Arrange()进行必要的调用。相关代码(最初在WebBrowser_LoadCompleted事件中,用于将演示移动到renderButton_OnClick)

演示该问题的完整项目可从以下网址获得:

按“取消隐藏”(webBrowser显示在视觉树中),然后按“转到”,然后按“渲染-->渲染捕获确定”。 然后按Hide(webBrowser消失),然后按Go,然后渲染-->无知的黑屏


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

我重现了您的问题。如果没有必要,控件似乎不会呈现。
您真的需要将
WebBrowser
放在可视化树中吗?
如果您只是想让它不可见,那么将
可见性设置为
折叠的
也不会起作用(我尝试过)

让WebBrowser对用户不可见,但仍然允许
WriteableBitmap
渲染的一个丑陋的技巧是将控件从视口中翻译出来。要做到这一点,只需使用
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.

丑陋但有效的解决方案

事实证明,这从一开始就是注定的

您不能在WP8的后台运行WebBrowser控件,句号。这是一个很好的例子。
而且,如上所述,存在一个问题(可能不是bug?),即WebBrowser不在可视树中时不会提供位图。

不,我不需要或不希望WebBrowser位于可视树中。我的目标是能够运行WebBrowser并在背景线程上捕获其图像。我很欣赏你有趣的破解,但我认为在后台也不行。不过,我还是要试一试。@BobHy,如果您只需要在背景线程上捕获WebBrowser图像,请选中此项。@NoStratio,对不起,WP8 WebBrowser控件没有.WriteToBitmap()方法。
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.