7

在我的 WPF 项目中,我需要呈现基于 HTML 的内容,其中内容存储在我的 WPF 项目引用的资源程序集中。

我查看了 WPF Frame 和 WebBrowser 控件。不幸的是,它们都只公开了导航事件(导航、导航),而不是任何允许我根据请求的 URL 返回从资源程序集中检索的 HTML 内容的事件。

我可以使用 Navigating 事件和 NavigateToString() 方法拦截导航请求并提供 HTML 内容。但这不适用于拦截图像、CSS 文件等的加载调用。

此外,我知道一个HTML 到 Flowdocument SDK 示例应用程序可能有用,但我可能必须大大扩展该示例以处理图像和样式表。

值得一提的是,我们还生成了要呈现的 HTML 内容(通过 Wiki 页面),因此源 HTML 在参考图像位置和使用的 CSS 样式表方面有些可预测(例如,可能没有 JavaScript)。我们希望显示来自互联网的随机 HTML 内容。

更新: 还可以为每个 HTML 页面创建一个 MHT 文件,这会将所有图像“内联”为 MIME 类型并减轻对更细粒度回调的需求。

4

2 回答 2

3

如果您可以使用 28 meg 的 DLL,您可能想看看BerkeliumSharp,它是一个非常棒的Berkelium库的托管包装器。Berkelium 在其核心使用 chromium 浏览器来提供屏幕外渲染和委托事件模型。你可以用它做很多很酷的事情,但是对于你的特定问题,在 Berkelium 中有一个名为 ProtocolHandler 的接口。协议处理程序的目的是接收 URL 并将 HTTP 标头和正文提供回底层渲染引擎。

在 BerkeliumSharp 测试应用程序(源代码中可用的项目之一)中,您可以看到它的一个特殊用途是FileProtocolHandler- 它使用 .NET 托管类(系统.IO)。你可以对像“resource://”这样的协议做同样的事情。实际上只有一种方法需要重写,称为 HandleRequest,如下所示:

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

WebBrowser公开了一个可能对您有用的NavigateToStream(Stream)方法:

如果您的内容随后存储为嵌入式资源,您可以使用:

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

还有一种NavigateToString(string)方法可以期望string文档的内容。

注意:我从来没有在愤怒中使用过这个,所以我不知道它会有多少帮助!

于 2010-11-02T11:56:06.417 回答