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 を押します。次に、[非表示] (webBrowser が非表示になります)、[実行]、[レンダリング]、[無知のブラック スクリーン] の順に押します。

当初、これはタイミングの問題だと思っていました (たとえば、LoadComplete イベントが発生したにもかかわらず、ブラウザーが Web ページの描画を完了していなかった可能性があります)。デモでは、レンダリングを行う「レンダリング」ボタンを押す前に数十秒待っても、黒い画像が表示されます。

4

2 に答える 2

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 に答える