2010-11-17 13 views
13

Supongamos que tengo una propiedad HTML (cadena). ¿Puedo vincular eso a un control WPF WebBrowser? Existe la propiedad Source donde necesito un URI, pero si tengo una cadena HTML en la memoria que quiero renderizar, ¿puedo hacer eso? Estoy usando MVVM, entonces creo que es más difícil usar métodos como webBrowser1.NavigateToString(), etc. porque no sabré el nombre del control?¿Puedo vincular HTML a un control de navegador web de WPF?

Respuesta

42

Ver this pregunta.

En resumen, primero se crea una propiedad adjunta, para WebBrowser

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 ?? " "); 
    } 
} 

Y entonces usted puede unirse a la cadena de html y NavigateToString se llamará cada vez que su cadena HTML cambia

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

Esta es una buen truco. Sin embargo, al intentar incrustar un WebBrowser dentro de un DataTemplate (por ejemplo, al crear plantillas en el elemento del combobox) no parece funcionar (por alguna razón, el OnHtmlChanged es levantado dos veces, la segunda vez con nulo). – Tomer

+0

@tomer Tuve el mismo problema, así que cambié e.NewValue como una cadena a e.NewValue como una cadena ?? " ". Edité el código para reflejar esto. –

Cuestiones relacionadas