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:
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="<h3>Hello World!!!</h3>" 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:
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:
WPF,
WebBrowser