[英]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頁面一樣完成。 圖像和CSS將由URL引用,就像任何其他HTML頁面一樣。 這里沒有魔力。
<WebBrowser Height="200" Name="myWebBrowser"></WebBrowser>
myWebBrowser.NavigateToString("EnterHtmlString");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.