【问题标题】:How do I load HTML into Webbrowser control for WPF?如何将 HTML 加载到 WPF 的 Webbrowser 控件中?
【发布时间】:2011-05-22 10:11:04
【问题描述】:

我的 WPF 客户端应用程序正在构建一个自定义 HTML 页面,我可以像这样加载 HTML,

this.myWebBrowser.NavigateToString("<html><body><p>test page</p></body></html>");

我遇到的问题是,如果 HTML 中有图像和 css 文件,如何将自定义 HTML 加载到 Webbrowser 控件中?

您如何引用图像和 css?图像和 css 可以嵌入到应用程序中,还是需要在某个目录中?

感谢您的帮助。

【问题讨论】:

    标签: c# .net wpf webbrowser-control


    【解决方案1】:
    <WebBrowser Height="200" Name="myWebBrowser"></WebBrowser>
    myWebBrowser.NavigateToString("EnterHtmlString");
    

    【讨论】:

    • 这如何回答这个问题?他已经使用了NavigateToString,我怀疑通过“EnterHtmlString”可以解决css和图像文件的问题。
    【解决方案2】:

    作为参考,我偶然发现了这个问题并使用了 Joel Mueller 的答案,但决定自动解析图像路径。也许有人会发现我的代码对于启动类似解决方案很有用 - 它非常粗糙和肮脏,但似乎做得很好。

    我正在使用 C# 资源,在我的 html 文件中,我只放置图像文件名。它还允许我在普通浏览器中打开文件以测试它的外观。代码自动在html中查找与filename同名的资源,保存在应用数据目录下,并替换路径。

    还值得注意的是,如果文件与已保存的文件不同,应用程序将覆盖该文件。主要是开发需要,但是我真的没有很多这些文件,所以我不在乎这里的性能损失。省略此检查并假设文件是​​最新的应该会提高性能。

    Settings.Default.ApplicationId 是一个带有应用程序名称的简单字符串,用于应用程序数据中的目录名称。

    这就是我的班级最终的样子:

        class MyHtmlImageEmbedder
        {
            static protected string _appDataDirectory =
                Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                    Settings.Default.ApplicationId);
    
            static public string getHtml()
            {
                String apiHelp = Resources.html_file;
                Regex regex = new Regex(@"src=\""(.*)\""", RegexOptions.IgnoreCase);
                MatchCollection mc = regex.Matches(apiHelp);
                foreach (Match m in mc)
                {
                    string filename = m.Groups[1].Value;
                    Image image = Resources.ResourceManager.GetObject(Path.GetFileNameWithoutExtension(filename)) as Image;
                    if (image != null)
                    {
                        var path = getPathTo(Path.GetFileNameWithoutExtension(filename) + ".png", imageToPngByteArray(image));
                        apiHelp = apiHelp.Replace(filename, path);
                    }
                }
                return apiHelp;
            }
    
            static public string getPathTo(string filename, byte[] contentBytes)
            {
                Directory.CreateDirectory(_appDataDirectory);
                var path = Path.Combine(_appDataDirectory, filename);
                if (!File.Exists(path) || !byteArrayCompare(contentBytes, File.ReadAllBytes(path)))
                {
                    File.WriteAllBytes(path, contentBytes);
                }
                return path;
            }
    
            [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
            static extern int memcmp(byte[] b1, byte[] b2, long count);
    
            public static bool byteArrayCompare(byte[] b1, byte[] b2)
            {
                // Validate buffers are the same length.
                // This also ensures that the count does not exceed the length of either buffer.  
                return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
            }
    
            public static byte[] imageToPngByteArray(Image image)
            {
                MemoryStream ms = new MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
        }
    

    请注意,byteArrayCompareFunction 仅出于性能原因使用 memcmp,但可以很容易地用简单的比较循环替换它。

    那么,我只是打电话给browser.NavigateToString(MyHtmlImageEmbedder.getHtml());

    【讨论】:

      【解决方案3】:

      由于您正在生成 HTML,因此您可以通过生成 base element 来设置所有脚本/图像的基本 url,该base element 指向您可以控制的位置,例如指向磁盘上文件夹的 file:/// url , 一个 url 指向你的本地网络服务器正在监听的 localhost(互联网上的 http 服务器示例太多,所以我不在这里详细介绍),或者你在 www 上的网站。

      当您导航到字符串时,HTML 将呈现在与 about:blank 相同的 Internet 区域中。根据客户端的 IE 安全区域设置,您的 HTML 可能无权在某些位置加载文件(例如,如果页面位于 Internet 区域中,则计算机上的脚本文件)。

      您可以使用Mark of the Web 更改您的 HTML 页面的 Internet 区域。

      【讨论】:

        【解决方案4】:

        实际上,存在嵌入图像的 HTML 页面。

        您可以使用data URI scheme 在 HTML 字符串中嵌入图像和 CSS。但是,并不是所有版本的 IE 都支持这个,而且 WebBrowser 控件确实是 IE。如果您的代码可能在 IE

        另一种选择是将图像和 CSS 存储为嵌入式资源,将它们写入临时文件,然后在生成 HTML 时将绝对 URL 插入临时文件。

        【讨论】:

        • 浏览器控件是否总是使用本地 IE,或者它是否被编译到我的应用程序中以便它始终可以工作,即使 pc 上只有 ie6 也是如此?
        • 我很确定它总是使用本地 IE。否则在一台机器上安装多个版本的 IE 进行测试会更容易。
        【解决方案5】:

        您可以像处理其他所有 HTML 页面一样执行此操作。图像和 CSS 将由 URL 引用,就像任何其他 HTML 页面一样。这里没有魔法。

        【讨论】:

        • 我的应用程序正在生成 HTML,它在 url 上不存在。
        • 但就像世界上所有其他 HTML 页面一样,任何图像或 CSS 都必须通过 URL 引用。没有嵌入图像的 HTML 页面。
        • 是的,我想是的。你考虑清楚了吗?也许是时候停下来阅读 HTML 教程了?
        • @Tony:真的,去阅读那个 HTML 教程。它将回答所有这些问题。这个问题的答案是:不行。
        猜你喜欢
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多