WebBrowser控件中的控件样式

时间:2016-03-02 20:47:59

标签: wpf

我有一个错误返回字符串,有时是纯文本,有时是HTML。我的想法是在WebBrowser控件中显示它。我发现这个article显示了如何将字符串指定为webBrowser的内容。这是我的XAML:

<WebBrowser
            local:BrowserBehavior.Html="{Binding ElementName=resultListBox, Path=SelectedItem.Details}" 
            Width="400" MinHeight="50" Margin="0">
        </WebBrowser>

它工作正常,但普通字符串有时会显示罗马字体。有没有办法将样式表注入WebBrowser控件?或者首先是我的问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以在附加财产的代码中执行此操作:

static void OnHtmlChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    WebBrowser webBrowser = dependencyObject as WebBrowser;
    webBrowser.LoadCompleted += WebBrowserOnLoadCompleted;
    if (webBrowser != null)
        webBrowser.NavigateToString(e.NewValue as string ?? "&nbsp;");
}

private static void WebBrowserOnLoadCompleted(object sender, NavigationEventArgs navigationEventArgs)
{
    var webBrowser = sender as WebBrowser;

    if (webBrowser != null)
    {
        var document = webBrowser.Document as mshtml.HTMLDocument;

        if (document != null)
        {
            var head = document.getElementsByTagName("head").OfType<mshtml.HTMLHeadElement>().FirstOrDefault();

            if (head != null)
            {
                var styleSheet = (mshtml.IHTMLStyleSheet)document.createStyleSheet("", 0);
                styleSheet.cssText = "* { background-color: purple; " +
                                     "    font-family: Arial, Helvetica, sans-serif; " +
                                     " /* set whatever CSS rule you want */ }";
            }
        }

        webBrowser.LoadCompleted -= WebBrowserOnLoadCompleted;
    }
}

您必须包含Microsoft.mshtml参考才能发挥作用。

这会在导航到LoadCompleted之前附加string事件处理程序。在处理程序中,它获取head元素,创建一个新的style标记并添加所需的CSS规则。