7

私の WPF プロジェクトでは、コンテンツが WPF プロジェクトによって参照されるリソース アセンブリに格納されている HTML ベースのコンテンツをレンダリングする必要があります。

WPF フレームと WebBrowser コントロールを見てきました。残念ながら、どちらもナビゲーション イベント (Navigating、Navigated) のみを公開しますが、要求された URL に基づいて、リソース アセンブリから取得した HTML コンテンツを返すことを可能にするイベントは公開しません。

Navigating イベントと NavigateToString() メソッドを使用して、ナビゲーション リクエストをインターセプトし、HTML コンテンツを提供できます。しかし、それは画像や CSS ファイルなどのロード呼び出しをインターセプトする場合には機能しません。

さらに、HTML から Flowdocument SDK へのサンプル アプリケーションが役立つ可能性があることは知っていますが、画像とスタイル シートを処理するには、サンプルを大幅に拡張する必要があるでしょう。

価値があるのは、(Wiki ページを介して) レンダリングされる HTML コンテンツも生成するため、ソース HTML は、参照される画像の場所と使用される CSS スタイル シートに関してある程度予測可能です (たとえば、JavaScript ではない可能性があります)。インターネットからランダムな HTML コンテンツを表示しようとしています。

更新: HTML ページごとに MHT ファイルを作成することもできます。これにより、すべての画像が MIME タイプとして「インライン化」され、より細かいコールバックの必要性が軽減されます。

4

2 に答える 2

3

28 MB の DLL を使用しても問題ない場合は、すばらしいBerkeliumライブラリのマネージド ラッパーであるBerkeliumSharpを調べてみてください。Berkelium は、クロム ブラウザーをコアに使用して、オフスクリーン レンダリングと委任されたイベント モデルを提供します。これでできる本当にクールなことがたくさんありますが、あなたの特定の問題のために、Berkelium には ProtocolHandler と呼ばれるインターフェースがあります。プロトコル ハンドラーの目的は、URL を受け取り、HTTP ヘッダーと本文を基になるレンダリング エンジンに返すことです。

BerkeliumSharp テスト アプリ (ソースで利用可能なプロジェクトの 1 つ) では、これの 1 つの特定の使用法を確認できます。これは、FileProtocolHandler.NET マネージ クラス (システム.IO)。「resource://」のような作成されたプロトコルに対しても同じことができます。次のような HandleRequest というメソッドをオーバーライドする必要があるのは、実際には 1 つだけです。

bool HandleRequest (string url, ref byte[] responseBody, ref string[] responseHeaders)

したがって、「resource://path/to/my/html」のような URL を取得し、そのメソッドで必要なすべての Assembly.GetResourceStream などを実行します。FileProtocolHandler を使用して独自のものを適応させる方法を見るのは非常に簡単なはずです。

berkelium と berkelium Sharp は両方とも、BSD ライセンスを持つオープン ソースです。

于 2010-11-02T00:55:30.420 に答える
3

は、あなたのために働くかもしれないNavigateToStream(Stream)メソッドをWebBrowser公開します:

コンテンツが埋め込みリソースとして保存されている場合は、次を使用できます。

var browser = new WebBrowser();
var source = Assembly.Load("ResourceAssemblyName");
browser.NavigateTo(source.GetManifestResourceStream("ResourceNamespace.ResourceName"));

ドキュメントの内容NavigateToString(string)を期待する方法もあります。string

注: 私はこれを怒りで使用したことがないので、どれだけ役立つかわかりません!

于 2010-11-02T11:56:06.417 に答える