Share via


Procedura: implementare comunicazioni bidirezionali tra il codice DHTML e il codice dell'applicazione client

Aggiornamento: novembre 2007

È possibile utilizzare il controllo WebBrowser per aggiungere codice DHTML (Dynamic HTML) dell'applicazione Web esistente alle applicazioni client Windows Form. Questa procedura si rivela utile quando si è investita una parte significativa dello sviluppo nella creazione di controlli basati su DHTML e si desidera usufruire di tutte le capacità offerte dall'interfaccia utente di Windows Form senza dover riscrivere il codice esistente.

Il controllo WebBrowser consente di implementare comunicazioni bidirezionali tra il codice dell'applicazione client e il codice di script della pagina Web mediante le proprietà ObjectForScripting e Document. È inoltre possibile configurare il controllo WebBrowser in modo da poter unire senza problemi i controlli Web agli altri controlli del form dell'applicazione, nascondendo la relativa implementazione DHTML. A questo scopo, è sufficiente formattare la pagina visualizzata in modo che il colore di sfondo e lo stile visivo corrispondano al resto del form e utilizzare le proprietà AllowWebBrowserDrop, IsWebBrowserContextMenuEnabled e WebBrowserShortcutsEnabled per disattivare le funzionalità standard del browser.

Per incorporare il codice DHTML in un'applicazione Windows Form

  1. Impostare la proprietà AllowWebBrowserDrop del controllo WebBrowser su false per impedire a WebBrowser di aprire i file trascinati nel controllo.

    webBrowser1.AllowWebBrowserDrop = False
    
    webBrowser1.AllowWebBrowserDrop = false;
    
  2. Impostare la proprietà IsWebBrowserContextMenuEnabled del controllo su false per impedire la visualizzazione del menu di scelta rapida di WebBrowser quando l'utente fa clic con il pulsante destro del mouse sul controllo.

    webBrowser1.IsWebBrowserContextMenuEnabled = False
    
    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    
  3. Impostare la proprietà WebBrowserShortcutsEnabled del controllo su false per impedire che il controllo WebBrowser risponda ai tasti di scelta rapida.

    webBrowser1.WebBrowserShortcutsEnabled = False
    
    webBrowser1.WebBrowserShortcutsEnabled = false;
    
  4. Impostare la proprietà ObjectForScripting nel costruttore del form o in un gestore eventi Load.

    Nel codice seguente è utilizzata la classe del form per l'oggetto script.

    Nota:

    È necessario che Component Object Model (COM) possa accedere all'oggetto script. Per rendere visibile il form a COM, aggiungere l'attributo ComVisibleAttribute alla classe del form.

    webBrowser1.ObjectForScripting = Me
    
    webBrowser1.ObjectForScripting = this;
    
  5. Implementare proprietà o metodi pubblici nel codice dell'applicazione che verrà utilizzato dal codice di script.

    Se ad esempio si utilizza la classe del form per l'oggetto script, aggiungere il seguente codice alla classe.

    Public Sub Test(ByVal message As String)
        MessageBox.Show(message, "client code")
    End Sub
    
    public void Test(String message)
    {
        MessageBox.Show(message, "client code");
    }
    
  6. Utilizzare l'oggetto window.external nel codice di script per accedere alle proprietà e ai metodi pubblici dell'oggetto specificato.

    Nel codice HTML riportato di seguito viene dimostrato come chiamare un metodo nell'oggetto script in seguito alla selezione di un pulsante. Copiare questo codice nell'elemento BODY di un documento HTML che è stato caricato mediante il metodo Navigate del controllo o a cui è stata assegnata la proprietà DocumentText del controllo.

    <button onclick="window.external.Test('called from script code')">
        call client code from script code
    </button>
    
  7. Implementare funzioni nel codice di script che verrà utilizzato dal codice dell'applicazione.

    L'elemento SCRIPT HTML riportato di seguito fornisce una funzione di esempio. Copiare questo codice nell'elemento HEAD di un documento HTML che è stato caricato mediante il metodo Navigate del controllo o a cui è stata assegnata la proprietà DocumentText del controllo.

    <script>
    function test(message) { 
        alert(message); 
    }
    </script>
    
  8. Utilizzare la proprietà Document per accedere al codice di script dal codice dell'applicazione client.

    Aggiungere ad esempio il codice seguente al gestore eventi Click di un pulsante.

    webBrowser1.Document.InvokeScript("test", _
        New String() {"called from client code"})
    
    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
    
  9. Una volta terminato il debug del codice DHTML, impostare la proprietà ScriptErrorsSuppressed del controllo su true per impedire al controllo WebBrowser di visualizzare messaggi di errore in caso di problemi nel codice di script.

    ' Uncomment the following line when you are finished debugging.
    'webBrowser1.ScriptErrorsSuppressed = True
    
    // Uncomment the following line when you are finished debugging.
    //webBrowser1.ScriptErrorsSuppressed = true;
    

Esempio

Nell'esempio di codice riportato di seguito viene illustrata un'applicazione di prova che può essere utilizzata per comprendere meglio questa funzionalità. Anziché essere caricato da un file HTML separato, il codice HTML viene caricato nel controllo WebBrowser mediante la proprietà DocumentText.

Imports System
Imports System.Windows.Forms
Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
Public Class Form1
    Inherits Form

    Private webBrowser1 As New WebBrowser()
    Private WithEvents button1 As New Button()

    <STAThread()> _
    Public Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New Form1())
    End Sub

    Public Sub New()
        button1.Text = "call script code from client code"
        button1.Dock = DockStyle.Top
        webBrowser1.Dock = DockStyle.Fill
        Controls.Add(webBrowser1)
        Controls.Add(button1)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
        Handles Me.Load

        webBrowser1.AllowWebBrowserDrop = False
        webBrowser1.IsWebBrowserContextMenuEnabled = False
        webBrowser1.WebBrowserShortcutsEnabled = False
        webBrowser1.ObjectForScripting = Me
        ' Uncomment the following line when you are finished debugging.
        'webBrowser1.ScriptErrorsSuppressed = True

        webBrowser1.DocumentText = _
            "<html><head><script>" & _
            "function test(message) { alert(message); }" & _
            "</script></head><body><button " & _
            "onclick=""window.external.Test('called from script code')"" > " & _
            "call client code from script code</button>" & _
            "</body></html>"
    End Sub

    Public Sub Test(ByVal message As String)
        MessageBox.Show(message, "client code")
    End Sub

    Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
        Handles button1.Click

        webBrowser1.Document.InvokeScript("test", _
            New String() {"called from client code"})

    End Sub

End Class
using System;
using System.Windows.Forms;
using System.Security.Permissions;

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Form1 : Form
{
    private WebBrowser webBrowser1 = new WebBrowser();
    private Button button1 = new Button();

    [STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }

    public Form1()
    {
        button1.Text = "call script code from client code";
        button1.Dock = DockStyle.Top;
        button1.Click += new EventHandler(button1_Click);
        webBrowser1.Dock = DockStyle.Fill;
        Controls.Add(webBrowser1);
        Controls.Add(button1);
        Load += new EventHandler(Form1_Load);
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.AllowWebBrowserDrop = false;
        webBrowser1.IsWebBrowserContextMenuEnabled = false;
        webBrowser1.WebBrowserShortcutsEnabled = false;
        webBrowser1.ObjectForScripting = this;
        // Uncomment the following line when you are finished debugging.
        //webBrowser1.ScriptErrorsSuppressed = true;

        webBrowser1.DocumentText =
            "<html><head><script>" +
            "function test(message) { alert(message); }" +
            "</script></head><body><button " +
            "onclick=\"window.external.Test('called from script code')\">" +
            "call client code from script code</button>" +
            "</body></html>";
    }

    public void Test(String message)
    {
        MessageBox.Show(message, "client code");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.Document.InvokeScript("test",
            new String[] { "called from client code" });
    }

}

Compilazione del codice

Per questo codice sono necessari i seguenti requisiti:

  • Riferimenti agli assembly System e System.Windows.Forms.

Per informazioni sulla generazione di questo esempio dalla riga di comando per Visual Basic o Visual C#, vedere Compilazione dalla riga di comando (Visual Basic) o Compilazione dalla riga di comando con csc.exe. È anche possibile generare questo esempio in Visual Studio incollando il codice in un nuovo progetto.

Vedere anche

Riferimenti

WebBrowser

WebBrowser.Document

WebBrowser.ObjectForScripting

Altre risorse

Controllo WebBrowser (Windows Form)