【问题标题】:WPF: Display HTML-based content stored in resource assemblyWPF:显示存储在资源程序集中的基于 HTML 的内容
【发布时间】:2011-01-13 20:49:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: html wpf controls mhtml


    【解决方案1】:

    如果您可以使用 28 meg 的 DLL,您可能想看看 BerkeliumSharp,它是一个非常棒的 Berkelium 库的托管包装器。 Berkelium 在其核心使用 chromium 浏览器来提供屏幕外渲染和委托事件模型。你可以用它做很多很酷的事情,但是对于你的特定问题,在 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 许可证的开源代码。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 这两者的问题是如何处理从 HTML 中引用的东西(例如图像或样式表)。浏览器不知道从哪里获取它们。
      • 所以资源也嵌入到您的程序集中?同样,我还没有尝试过,但是您可以使用包 URI(可能需要将其注入原始 HTML)来解决这个问题
      • Matt,您可以直接在 HTML 中嵌入图像,但样式表可能会出现问题。我必须查看控件是否生成加载请求(通过事件或委托)。
      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多