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

标签 html wpf controls mhtml

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

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

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

此外,我知道一个 HTML to Flowdocument SDK sample application这可能很有用,但我可能不得不大大扩展示例以处理图像和样式表。

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

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

最佳答案

如果您可以使用 28 兆的 DLL,您可能想看看 BerkeliumSharp ,这是一个很棒的 Berkelium 的托管包装器图书馆。 Berkelium 在其核心使用 chromium 浏览器来提供离屏渲染和委托(delegate)事件模型。您可以用它做很多很酷的事情,但是对于您的特定问题,在 Berkelium 中有一个名为 ProtocolHandler 的接口(interface)。协议(protocol)处理程序的目的是接收 URL 并将 HTTP header 和正文提供回底层呈现引擎。

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

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

因此,您将使用“resource://path/to/my/html”之类的 URL,并在该方法中执行所有必要的 Assembly.GetResourceStream 等操作。看一下如何使用 FileProtocolHandler 来适配您自己的应该很容易。

berkelium 和 berkelium sharp 都是开源的,具有 BSD 许可证。

关于html - WPF:显示存储在资源程序集中的基于 HTML 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213206/

相关文章:

java - 如何在 Jquery 中获取/触发复选框在页面加载后执行自身

javascript - Vue v-for : iterate one element individually in an array

php - HMVC 和 HTML 组件化

c# - WPF DataGrid 的 EnableRowVirtualization 和 VirtualizingStackPanel.IsVirtualizing 属性之间的区别

wpf - 在数据网格单元格内设置光标位置并选择文本

c# - 如何禁用 ContentControl 中的所有绑定(bind)/触发

javascript - 在字符串的每次出现处添加标签

c# - 我可以在 WPF 中设置窗口边框颜色吗?

silverlight - 将 FontFamily 应用于 Silverlight 4 Beta 中的所有控件

Javascript 似乎脱离了控制流