如何将字符串 html 内容显示到 webbrowser 控件中?

Posted

技术标签:

【中文标题】如何将字符串 html 内容显示到 webbrowser 控件中?【英文标题】:How to display the string html contents into webbrowser control? 【发布时间】:2011-07-18 18:27:02 【问题描述】:

我有一个 c# win 应用程序。我将 html 格式的文本保存在我的数据库中,但我想在 webbrowser 中向我的用户显示它。

提前致谢

【问题讨论】:

c# webcontrol - how to load a html on the fly? 的可能重复项 这个问题似乎没有任何标签来指示您正在为 which Windows 平台构建此应用程序。 -- 对于我们这些通过谷歌搜索结束并想知道如何在 Windows 10(或 UWP)应用程序中执行此操作的人,浏览器控件(称为 WebView)有一个名为 NavigateToString 的方法,您可以在其中只需传入 HTML。 这是 WebBrowser 控件,而不是 WebView - 所以这是用于 Windows 窗体的。 【参考方案1】:

试试这个:

webBrowser1.DocumentText =
    "<html><body>Please enter your name:<br/>" +
    "<input type='text' name='userName'/><br/>" +
    "<a href='http://www.microsoft.com'>continue</a>" +
    "</body></html>";

【讨论】:

这仅在第一次通话时对我有用。即使是额外的 webbrowser1.Refresh() 也无助于第二次通话。最后,这对我有帮助:weblogs.asp.net/gunnarpeipman/archive/2009/08/15/…【参考方案2】:

您可以这样做,而不是导航到空白处

webBrowser1.DocumentText="0";
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write(theHTML);
webBrowser1.Refresh();

无需等待事件或其他任何事情。您可以检查 MSDN 的 OpenNew,而我已经在我的一个项目中测试了初始 DocumentText 分配并且它有效。

【讨论】:

虽然看起来很老套,但这是唯一似乎始终有效的方法。【参考方案3】:

正如 Thomas W. 评论的那样 - 我几乎错过了这条评论,但我遇到了同样的问题,所以我认为值得重写作为答案。

主要问题是在第一次将webBrowser1.DocumentText 分配给某些html 之后,后续分配没有效果。

Thomas 链接的解决方案可以在 http://weblogs.asp.net/gunnarpeipman/archive/2009/08/15/displaying-custom-html-in-webbrowser-control.aspx 找到详细信息,但我将在下面总结,以防此页面将来不可用。

简而言之,由于 webBrowser 控件的工作方式,每次您希望更改内容时都必须导航到新页面。因此作者提出了一种更新控件的方法:

private void DisplayHtml(string html)

    webBrowser1.Navigate("about:blank");
    if (webBrowser1.Document != null)
    
        webBrowser1.Document.Write(string.Empty);
    
    webBrowser1.DocumentText = html;

然而,我发现在我当前的应用程序中,我从if(webBrowser1.Document != null) 行得到了一个 CastException。我不确定为什么会这样,但我发现如果我将整个 if 块包装在 try catch 中,所需的效果仍然有效。见:

private void DisplayHtml(string html)

    webBrowser1.Navigate("about:blank");
    try
    
        if (webBrowser1.Document != null)
        
            webBrowser1.Document.Write(string.Empty);
        
    
    catch (CastException e)
      // do nothing with this
    webBrowser1.DocumentText = html;

所以每次执行DisplayHtml 的函数时,我都会从if 语句中收到CastException,因此永远不会到达if 语句的内容。但是,如果我注释掉if 语句以免收到CastException,则浏览器控件不会得到更新。我怀疑 Document 属性背后的代码还有另一个副作用,尽管它也会引发异常。

无论如何,我希望这对人们有所帮助。

【讨论】:

你忘记包含这一行 => You should set AllowNavigation property to true before you deal with contents shown to users. 【参考方案4】:

由于某种原因,m3z 提供的代码(使用DisplayHtml(string) 方法)在我的情况下不起作用(第一次除外)。我总是从字符串中显示 html。这是我与 WebBrowser 控件战斗后的版本:

webBrowser1.Navigate("about:blank");
while (webBrowser1.Document == null || webBrowser1.Document.Body == null)
    Application.DoEvents();
webBrowser1.Document.OpenNew(true).Write(html);

每次都为我工作。我希望它可以帮助某人。

【讨论】:

有趣。我想知道为什么我的解决方案对我有用而不是你。我也不能说我已经尝试过您的解决方案,但它似乎是一个类似的概念。 我不知道,但我怀疑它是 DoEvents() 方法。我认为当您导航到“about:blank”时,它需要一些时间(可能在另一个线程中)并且您的下一个“if”语句在我的 PC 上不起作用,因为 1. 它与 Navigate 的效果没有线程同步( ),以及 2. 我的处理器的速度/负载与你的不同,我对“if”处理没有你那么幸运。更不用说 DoEvents() 可以在同一个线程上做一些事情。当然,这只是一种猜测。此外,您没有 OpenNew 通话。我肯定知道的一件事是我总是在使用 WebBrowser 时遇到问题。 是的,我记得我不太喜欢 WebBrowser 控件。我随后找到了一个基于 webkit 的替换控件并将其添加到书签,我打算在未来的项目中使用它。 我将此标记为“已回答”,因为 Application.DoEvents();解决了我的问题。我正在使用webBrowser1.DocumentText = myHtml; while (webBrowser1.DocumentText != myHtml) Application.DoEvents(); 【参考方案5】:

简单的解决方案,我已经测试过了

webBrowser1.Refresh();
var str = "<html><head></head><body>" + sender.ToString() + "</body></html>";
webBrowser1.DocumentText = str;

【讨论】:

【参考方案6】:

webBrowser.NavigateToString(yourString);

【讨论】:

您的 webBrowser 控件上是否存在“NavigateToString”方法?因为它不在我的身上。 我的也不存在。 @BrianS:我没有注意到。已删除评论。谢谢 NavigateToString 仅存在于 WPF 版本的 WebBrowser 控件中【参考方案7】:

这是一个小代码。它(对我来说)适用于 WebBrowser 控件的任何后续 html 代码更改。您可以根据自己的具体需求对其进行调整。

    static public void SetWebBrowserHtml(WebBrowser Browser, string HtmlText)
    
        if (Browser != null)
        
            if (string.IsNullOrWhiteSpace(HtmlText))
            
                // Putting a div inside body forces control to use div instead of P (paragraph)
                // when the user presses the enter button
                HtmlText = 
                        @"<html>
                    <head>
                    <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"" />
                    </head>
                      <div></div>
                    <body>
                    </body>
                    </html>";
            

            if (Browser.Document == null)
            
                Browser.Navigate("about:blank");

                //Wait for document to finish loading
                while (Browser.ReadyState != WebBrowserReadyState.Complete)
                
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(5);
                
            

            // Write html code
            dynamic Doc = Browser.Document.DomDocument;
            Doc.open();
            Doc.write(HtmlText);
            Doc.close();


            // Add scripts here 
            /*  
            dynamic Doc = Document.DomDocument;
            dynamic Script = Doc.getElementById("MyScriptFunctions");
            if (Script == null)
            
                Script = Doc.createElement("script");
                Script.id = "MyScriptFunctions";
                Script.text = javascriptFunctionsSourcecode;
                Doc.appendChild(Script);
                             
            */



            // Enable contentEditable   
            /*  
            if (Browser.Document.Body != null)
            
                if (Browser.Version.Major >= 9)
                    Browser.Document.Body.SetAttribute("contentEditable", "true");
                         
             */

            // Attach event handlers
            // Browser.Document.AttachEventHandler("onkeyup", BrowserKeyUp);
            // Browser.Document.AttachEventHandler("onkeypress", BrowserKeyPress);
            // etc...
        
            

【讨论】:

对我不起作用动态 Doc = Browser.Document.DomDocument; // 到目前为止一切顺利 Doc.open(); // 开始崩溃,由于缺少使用动态 Doc.write(HtmlText) 的参考; Doc.close();【参考方案8】:

老问题,但这是我的首选。

If browser.Document IsNot Nothing Then
    browser.Document.OpenNew(True)
    browser.Document.Write(My.Resources.htmlTemplate)
Else
    browser.DocumentText = My.Resources.htmlTemplate
End If

并且确保任何browser.Navigating 事件不会取消“about:blank”网址。下面的示例事件用于完全控制 WebBrowser 导航。

Private Sub browser_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles browser.Navigating

    Try
        Me.Cursor = Cursors.WaitCursor

        Select Case e.Url.Scheme

            Case Constants.App_Url_Scheme

                Dim query As Specialized.NameValueCollection = System.Web.HttpUtility.ParseQueryString(e.Url.Query)

                Select Case e.Url.Host

                    Case Constants.Navigation.URLs.ToggleExpander.Host

                        Dim nodeID As String = query.Item(Constants.Navigation.URLs.ToggleExpander.Parameters.NodeID)

                        :
                        :
                        <other operations here>
                        :
                        :

                End Select

            Case Else
                e.Cancel = (e.Url.ToString() <> "about:blank")

        End Select

    Catch ex As Exception
        ExceptionBox.Show(ex, "Operation failed.")
    Finally
        Me.Cursor = Cursors.Default
    End Try

End Sub

【讨论】:

【参考方案9】:

m3z 推荐的 DisplayHtml(string html) 对我有用。

如果它对某人有帮助,我还想提一下,最初我的 HTML 中有一些空格使 HTML 无效,因此文本显示为字符串。当我将 HTML 粘贴到 Visual Studio 中时,引入了空格(在尖括号周围)。因此,如果在您尝试本文中提到的解决方案后您的文本仍然显示为文本,那么可能值得检查 HTML 语法是否正确。

【讨论】:

以上是关于如何将字符串 html 内容显示到 webbrowser 控件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串 html 内容显示到 webbrowser 控件中?

带有检查元素功能的 HTML 渲染?如何使用 C#

如何显示网页的加载过程

silverlight 中使用WebBrowser打开网页时为啥总在顶层?

将阅读更多按钮添加到字符串 html 反应

如何在文本区域中显示数组内容?