WebBrowser è uno dei controlli standard forniti dal Framework .NET fin dalla versione 1.0, e le sue potenzialità sono abbastanza
elevate da permetterci di "creare" (o quanto meno, simulare) un nostro personale web browser, come Mozilla FireFox, Opera o Google Chrome.
Non a caso ho messo tra virgolette il verbo creare, poiché il controllo che andremo ad analizzare tra poco assolve un'unica
funzione, che costituisce, però, il fulcro di tutta la navigazione.
WebBrowser permette di caricare al proprio interno una pagina web e di visualizzarla senza praticamente scrivere alcun codice. Nei prossimi
paragrafi illustrerò come scrivere un semplicissimo programma di navigazione basato su questa classe.
Dopo aver creato un nuovo progetto Windows Forms, trascinate sulla superficie del designer un nuovo controllo WebBrowser. Una volta posizionato dovrebbe mostrarsi come un'area totalmente bianca: per ora, infatti, non contiene ancora nessuna pagina. Prima di procedere, ecco uno sguardo alla lista dei suoi membri più importanti:
- CanGoBack : determina se sia possibile tornare indietro nella cronologia
- CanGoForward : determina se sia possibile andare avanti nella cronologia
- Document : un oggetto di tipo HtmlDocument contenente tutte le informazioni sulla pagina. Tra le sue proprietà, inoltre, ci sono molti modi per ottenere una vasta gamma di tag, ma illustrerò in dettaglio questi meccanismi nel prossimo capitolo
- DocumentStream : permette di leggere la pagina web come da un file. Restituisce un oggetto System.IO.Stream
- DocumentText : restituisce o imposta il codice della pagina. Dopo aver caricato una pagina, contiene il suo codice HTML. Modificando questa proprietà, anche la pagina visualizzata verrà rielaborata (e ricaricata) di conseguenza
- DocumentTitle : il titolo del documento
- DocumentType : il tipo del documento
- GoBack : torna indietro alla pagina precedente
- GoForward : procede alla pagina successiva
- GoHome : ritorna all'Home Page. Per ottenere l'indirizzo di quest'ultima, ricerca nel registro di sistema le preferenze che l'utente ha impostato per il browser Internet Explorer
- GoSearch : si reca alla pagina di ricerca predefinita. Esegue lo stesso procedimento di GoHome
- IsBusy : indica se il controllo sta caricando un nuovo documento
- IsOffline : indica se il controllo è in modalità offline (sta processando pagine web su disco fisso)
- IsWebBrowserContextMenuEnabled : determina se sia attivo il menù contestuale predefinito per il Web Browser
- Naviagate(S) : apre la pagina referenziata dall'indirizzo url S
- Print : stampa il documento aperto con i settaggi impostati della stampante corrente
- ReadyState : restituisce lo stato del controllo. L'enumeratore può assumere quattro valori: Complete (pagina completa), Interactive (le parti della pagina caricate sono sufficienti a garantire un minimo di interazione con l'utente, ad esempio con dei click sui link presenti), Loaded (il documento è caricato e inizializzato, ma non tutti i dati sono ancora stati ricevuti), Loading (il documento è in caricamento) e Uninitialized (nessun documento è stato aperto)
- ShowPageSetupDialog : visualizza le impostazioni pagina con una finestra di dialogo Internet Explorer
- ShowPrintDialog : visualizza la finestra di stampa di Internet Explorer
- ShowPrintPreviewDialog : visualizza l'anteprima di stampa in una finestra Internet Explorer
- ShowPropertiesDialog : visualizza la finestra delle proprietà pagina come Internet Explorer
- ShowSaveAsDialog : visualizza la finestra di dialogo di salvataggio di Internet Explorer
- Url : restituisce un oggetto Uri rappresentante l'indirizzo della pagina caricata
- Version : la versione di Internet Explorer installata
Alcune delle funzionalità esposte da questi membri si reggono pesantemente su Internet Explorer, come ad esempio la visualizzazione
dell'anteprima o la ricerca della home page (che potete cambiare solo dal menù opzioni di IE). Nonostante tali pesanti impedimenti,
è possibile usare il controllo con semplicità.
Nel nostro progetto possiamo quindi aggiungere qualche altro controllo:
- btnBack per andare indietro;
- btnForward per andare avanti;
- btnRefresh per aggiornare la pagina;
- txtUrl per contenere l'indirizzo a cui recarsi;
Come vedete ho inserito tutti i controlli sopra menzionati in un ToolStrip, e tutti i pulsanti sono di default disattivati (Enabled = False),
poiché all'inizio non è caricata nessuna pagina e di conseguenza non si può effettuare alcuna operazione.
Con questo semplice codice potremo iniziare a navigare un po':
Public Class Form1 Private Sub txtUrl_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtUrl.KeyDown 'Quando si preme invio durante la digitazione, naviga 'alla pagina indicata If e.KeyCode = Keys.Enter Then wbBrowser.Navigate(txtUrl.Text) 'Poiché si inizia a navigare, è lecito fermare 'il caricamento, quindi attiva btnCancel btnCancel.Enabled = True End If End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click 'Ferma l'attività del WebBrowser wbBrowser.Stop() btnCancel.Enabled = False btnRefresh.Enabled = True End Sub Private Sub wbBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles wbBrowser.Navigating 'L'evento Navigating si genera prima della navigazione btnCancel.Enabled = True End Sub Private Sub wbBrowser_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wbBrowser.DocumentCompleted 'L'evento DocumentCompleted si verifica quando una pagina 'è stata completamente caricata. Se anche una sola 'delle parti della pagina non è completa, l'evento 'non viene generato. Per evitare brutte soprese, potete 'utilizzare l'evento Navigated, che si verifica dopo la 'navigazione (indipendentemente dal successo o meno 'dell'operazione) btnCancel.Enabled = False btnBack.Enabled = wbBrowser.CanGoBack btnForward.Enabled = wbBrowser.CanGoForward btnRefresh.Enabled = True End Sub Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click wbBrowser.Refresh() End Sub Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click wbBrowser.GoBack() End Sub Private Sub btnForward_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForward.Click wbBrowser.GoForward() End Sub End Class
Come alternativa a DocumentCompleted, si può utilizzare Navigated:
Private Sub wbBrowser_Navigated(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles wbBrowser.Navigated btnCancel.Enabled = False btnBack.Enabled = wbBrowser.CanGoBack btnForward.Enabled = wbBrowser.CanGoForward btnRefresh.Enabled = True End Sub
Possiamo ora aggiungere una barra di stato in basso per comunicare lo stato della navigazione:
Public Class Form1 Private Sub txtUrl_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtUrl.KeyDown If e.KeyCode = Keys.Enter Then wbBrowser.Navigate(txtUrl.Text) btnCancel.Enabled = True End If End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click wbBrowser.Stop() btnCancel.Enabled = False btnRefresh.Enabled = True End Sub Private Sub wbBrowser_Navigating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) Handles wbBrowser.Navigating btnCancel.Enabled = True 'La proprietà StatusText contiene in forma leggibile 'un resoconto dell'operazione che il controllo sta svolgendo lblStatus.Text = wbBrowser.StatusText End Sub Private Sub wbBrowser_Navigated(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserNavigatedEventArgs) Handles wbBrowser.Navigated btnCancel.Enabled = False btnBack.Enabled = wbBrowser.CanGoBack btnForward.Enabled = wbBrowser.CanGoForward btnRefresh.Enabled = True lblStatus.Text = "Pagina caricata" End Sub Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click wbBrowser.Refresh() End Sub Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click wbBrowser.GoBack() End Sub Private Sub btnForward_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForward.Click wbBrowser.GoForward() End Sub Private Sub wbBrowser_ProgressChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserProgressChangedEventArgs) Handles wbBrowser.ProgressChanged prgProgress.Value = e.CurrentProgress / e.MaximumProgress * 100 lblStatus.Text = wbBrowser.StatusText End Sub End Class
Dato che questo non vuole essere un tutorial su come creare un browser, ma solo un abstract per mostrare le funzionalità del controllo,
non mi dilungherò oltre nella modifica e nella raffinazione dell'applicazione proposta in esempio, anche perchè sono sicuro
che qualche lettore lo starà già facendo e non vorrei togliergli il divertimento XD