簡體   English   中英

如何將HTML加載到WPF的Webbrowser控件中?

[英]How do I load HTML into Webbrowser control for WPF?

我的WPF客戶端應用程序正在構建一個自定義HTML頁面,我可以像這樣加載HTML,

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

我遇到的問題是,如果HTML中包含圖像和css文件,如何將自定義HTML加載到Webbrowser控件中?

你如何參考圖像和CSS? 可以將圖像和CSS嵌入到應用程序中,還是需要將它們放在某個目錄中?

謝謝您的幫助。

實際上,有一個帶嵌入圖像的HTML頁面。

您可以使用數據URI方案將圖像和CSS嵌入HTML字符串中。 但是,並非所有版本的IE都支持此功能,而WebBrowser控件實際上就是IE。 如果你的代碼可能在IE <8的機器上運行,這種方法對你沒有幫助。

另一種選擇是將圖像和CSS存儲為嵌入資源,將它們寫入臨時文件,然后在生成HTML時將絕對URL插入臨時文件。

作為參考,我偶然發現了這個問題並使用了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());

由於您正在生成HTML,因此您可以通過生成指向您可以控制的某個位置的基本元素來設置所有腳本/圖像的基本URL,例如指向磁盤上的文件夾的文件:/// url,指向的URL到您本地Web服務器正在偵聽的localhost(因特網上有太多的http服務器示例,所以我不在這里詳細介紹),或者您的網站在www上。

當您導航到字符串時,HTML將在與about:blank相同的interenet區域中呈現。 根據客戶端的IE安全區域設置,您的HTML可能沒有權限在某些位置加載文件(如果頁面位於Internet區域中,則計算機上的腳本文件)。

您可以使用Web標記更改HTML頁面的Internet區域。

您可以像其他每個HTML頁面一樣完成。 圖像和CSS將由URL引用,就像任何其他HTML頁面一樣。 這里沒有魔力。

<WebBrowser Height="200" Name="myWebBrowser"></WebBrowser>
myWebBrowser.NavigateToString("EnterHtmlString");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM