Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Il controllo WebBrowser

Guida al Visual Basic .NET

Capitolo 79° - Il controllo WebBrowser

<< Precedente Prossimo >>

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.

La fisionomia di WebBrowser

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;

WebBrowser1.jpg
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

WebBrowser2.jpg
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

<< Precedente Prossimo >>
A proposito dell'autore

C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...