Posts
256
Comments
330
Trackbacks
7
WPF 3.5 SP1: Bindable WebBrowser

Se in una nostra WPF Windows Application abbiamo la necessità di utilizzare il nuovo controllo WebBrowser  per visualizzare del codice HTML, possiamo percorrere due strade, secondo delle nostre esigenze:

1) Il codice HTML deve essere visualizzato (ad esempio) sull'evento click di un controllo button: possiamo utilizzare i metodi NavigateToString(string text) o NavigateToStream(System.IO.Stream stream). Ad esempio, se scriviamo:

1 WebBrowserInstance.NavigateToString("<h2>Prova</h2><p>Ciao</p>");

otteniamo:

image

dove il codice XAML è:

1 <WebBrowser ClipToBounds="True" Name="WebBrowserInstance"></WebBrowser>

2) Se il codice HTML da visualizzare è ottenuto dinamicamente, sembra non essere presente (attualmente) un modo diretto per bindare il codice HTML ad una proprietà del controllo WebBrowser (anche se quest'ultimo è un DependencyObject). Per ovviare al problema possiamo creare un nuovo UserControl contenente un controllo WebBrowser. Il codice XAML dell'UserControl è:

1 <UserControl x:Class="MyNamespace.BindableWebBrowser" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Height="300" Width="300" Loaded="UserControl_Loaded"> 5 <Grid Name="contentGrid"> 6 </Grid> 7 </UserControl> 8

Mentre il codice C# è:

1 namespace MyNamespace 2 { 3 public partial class BindableWebBrowser : UserControl 4 { 5 6 private WebBrowser _wb = null; 7 8 public WebBrowser Wb 9 { 10 get { return _wb; } 11 set { _wb = value; } 12 } 13 14 public BindableWebBrowser() 15 { 16 InitializeComponent(); 17 18 _wb = new WebBrowser(); 19 _wb.Margin = new Thickness(0); 20 contentGrid.Children.Add(_wb); 21 } 22 23 public string HtmlCode 24 { 25 get { return (string)GetValue(TextProperty); } 26 set { SetValue(TextProperty, value); } 27 } 28 29 public static readonly DependencyProperty TextProperty = 30 DependencyProperty.Register("HtmlCode", typeof(string), 31 typeof(BindableWebBrowser), new UIPropertyMetadata(string.Empty, new PropertyChangedCallback(HtmlDocumentChangedCallBack))); 32 33 public static void HtmlDocumentChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 34 { 35 BindableWebBrowser bindableWebBrowser = (BindableWebBrowser)property; 36 bindableWebBrowser.Wb.NavigateToString((string)args.NewValue); 37 } 38 39 private void UserControl_Loaded(object sender, RoutedEventArgs e) 40 { 41 } 42 } 43 }

In questo modo in una Window WPF, nel codice XAML, possiamo scrivere:

1 <local:BindableWebBrowser HtmlCode="&lt;h3&gt;Hello World!!!&lt;/h3&gt;" Margin="24.577,60,12,0" Grid.Column="1" Height="65" VerticalAlignment="Top"></local:BindableWebBrowser >

oppure eseguire un binding del controllo in questo modo:

1 <local:BindableWebBrowser HtmlCode="{Binding Path=Description}" ></local:BindableWebBrowser >

Ottenendo, utilizzando il codice del primo caso, quanto segue:

image

Se invece il nostro scopo è semplicemente visualizzare un sito web, allora è sufficiente scrivere nel codice XAML:

1 <WebBrowser Source="http://blogs.ugidotnet.org/" ClipToBounds="True" Name="wbTest"></WebBrowser>

Senza scrivere un nuovo UserControl.

L'aspetto grafico dell'UserControl può essere notevolmente migliorato (parliamo di WPF :-)), ma spero che il codice possa ritornare utile.

 

Technorati Tag: ,

 

posted on domenica 17 agosto 2008 16.16 Print
Comments
Gravatar
# re: WPF 3.5 SP1: Bindable WebBrowser
Fabrizio Lapiello
17/08/2008 18.44
  
utilissimo, grazie per l'info
Gravatar
# re: WPF 3.5 SP1: Bindable WebBrowser
Luca
29/08/2008 17.20
  
Una domanda:

Con la navigatetostream. quando è sicuro chiudere lo stream? perchè essendo asincrona, non sò quando posso chiuderlo e siccome la mia applicazione deve leggere + pagine tramite la navigatetostream, non vorrei avere problemi di memoria.

Grazie in anticipo per la risposta
Gravatar
# re: WPF 3.5 SP1: Bindable WebBrowser
Pietro Libro
30/08/2008 13.31
  
Potresti sfruttare l'evento LoadCompleted del controllo WebBrowser.

http://msdn.microsoft.com/en-us/library/system.windows.controls.webbrowser.loadcompleted.aspx
Comments have been closed on this topic.
News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro