表示されているツリーにない 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 を押します。次に、[非表示] (webBrowser が非表示になります)、[実行]、[レンダリング]、[無知のブラック スクリーン] の順に押します。
当初、これはタイミングの問題だと思っていました (たとえば、LoadComplete イベントが発生したにもかかわらず、ブラウザーが Web ページの描画を完了していなかった可能性があります)。デモでは、レンダリングを行う「レンダリング」ボタンを押す前に数十秒待っても、黒い画像が表示されます。