2010-11-17 92 views
13

假设我有一个属性HTML(字符串)。我可以将它绑定到WPF WebBrowser控件吗?有Source属性,我需要一个URI,但如果我在内存中有一个HTML字符串,我想渲染,我可以这样做吗?我正在使用MVVM,所以我认为它更难使用像webBrowser1.NavigateToString()等方法?因为我不知道控制名称?我可以将HTML绑定到WPF Web浏览器控件吗?

回答

42

请参阅this的问题。

总之,首先创建一个web浏览器

public class BrowserBehavior 
{ 
    public static readonly DependencyProperty HtmlProperty = DependencyProperty.RegisterAttached(
      "Html", 
      typeof(string), 
      typeof(BrowserBehavior), 
      new FrameworkPropertyMetadata(OnHtmlChanged)); 

    [AttachedPropertyBrowsableForType(typeof(WebBrowser))] 
    public static string GetHtml(WebBrowser d) 
    { 
     return (string)d.GetValue(HtmlProperty); 
    } 

    public static void SetHtml(WebBrowser d, string value) 
    { 
     d.SetValue(HtmlProperty, value); 
    } 

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

一个附加的属性,然后可以绑定到你的HTML字符串和NavigateToString将被调用每次你的HTML字符串改变

<WebBrowser local:BrowserBehavior.Html="{Binding MyHtmlString}" /> 
+0

这是一个好戏。然而,当试图在DataTemplate中嵌入WebBrowser时(例如,当模板化组合框的项目时),它似乎不起作用(出于某种原因,OnHtmlChanged被引发两次,第二次使用null)。 – Tomer 2012-04-23 08:55:43

+0

@tomer我有同样的问题,所以我只是改变e.NewValue作为字符串e.NewValue作为字符串? “ ”。我编辑了代码来反映这一点。 – 2014-07-06 22:05:50