WPF:显示存储在资源程序集中的基于HTML的内容

时间:2010-02-06 13:19:50

标签: html wpf controls mhtml

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

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

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

此外,我知道HTML to Flowdocument SDK sample application可能有用,但我可能需要大量扩展样本以处理图像和样式表。

对于它的价值,我们还生成要呈现的HTML内容(通过Wiki页面),因此对于所使用的引用图像位置和CSS样式表,源HTML在某种程度上是可预测的(例如,可能没有JavaScript)。我们希望从互联网上显示随机的HTML内容。

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

2 个答案:

答案 0 :(得分:3)

如果您对使用28 meg DLL感到满意,可能需要查看BerkeliumSharp,它是一个围绕着令人敬畏的Berkelium库的托管包装器。 Berkelium使用铬浏览器作为核心,提供屏幕外渲染和委托事件模型。你可以做很多非常酷的事情,但对于你的特殊问题,在Berkelium中有一个名为ProtocolHandler的接口。协议处理程序的目的是接收URL并将HTTP标头和正文提供回底层呈现引擎。

在BerkeliumSharp测试应用程序(源代码中可用的项目之一)中,您可以看到FileProtocolHandler的一个特定用途 - 它处理“file://”的所有文件IO使用.NET托管类(System.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许可证。

答案 1 :(得分:3)

WebBrowser公开了一个可能适合您的NavigateToStream(Stream)方法:

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

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

还有NavigateToString(string)方法需要文档的string内容。

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