Condividi tramite


Procedura: Implementare la comunicazione Two-Way tra codice DHTML e codice dell'applicazione client

È possibile utilizzare il controllo WebBrowser per aggiungere il codice esistente dell'applicazione Web dinamica HTML (DHTML) alle applicazioni client Windows Forms. Ciò è utile quando si è investito molto tempo di sviluppo nella creazione di controlli basati su DHTML e si desidera sfruttare le funzionalità avanzate dell'interfaccia utente di Windows Form senza dover riscrivere il codice esistente.

Il controllo WebBrowser consente di implementare la comunicazione bidirezionale tra il codice dell'applicazione client e il codice di scripting della pagina Web tramite le proprietà ObjectForScripting e Document. Inoltre, è possibile configurare il controllo WebBrowser in modo che i controlli Web si fondono perfettamente con altri controlli nel modulo dell'applicazione, nascondendo l'implementazione DHTML. Per combinare facilmente i controlli, formattare la pagina visualizzata in modo che il colore di sfondo e lo stile di visualizzazione corrispondano al resto del modulo e utilizzare le proprietà AllowWebBrowserDrop, IsWebBrowserContextMenuEnablede WebBrowserShortcutsEnabled per disabilitare le funzionalità standard del browser.

Per incorporare DHTML nell'applicazione Windows Form

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

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

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

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. Impostare la proprietà ObjectForScripting nel costruttore del modulo o eseguire l'override del metodo OnLoad.

    Nel codice seguente viene utilizzata la classe form stessa per l'oggetto scripting.

    webBrowser1.ObjectForScripting = new MyScriptObject(this);
    
    webBrowser1.ObjectForScripting = New MyScriptObject(Me)
    
  5. Implementa il tuo oggetto scripting.

    public class MyScriptObject
    {
        private Form1 _form;
    
        public MyScriptObject(Form1 form)
        {
            _form = form;
        }
    
        public void Test(string message)
        {
            MessageBox.Show(message, "client code");
        }
    }
    
    Public Class MyScriptObject
        Private _form As Form1
    
        Public Sub New(ByVal form As Form1)
            _form = form
        End Sub
    
        Public Sub Test(ByVal message As String)
            MessageBox.Show(message, "client code")
        End Sub
    
    End Class
    
  6. Usare l'oggetto window.external nel codice di scripting per accedere alle proprietà e ai metodi pubblici dell'oggetto specificato.

    Il codice HTML seguente illustra come chiamare un metodo sull'oggetto di scripting tramite il clic di un pulsante. Copiare questo codice nell'elemento BODY di un documento HTML caricato utilizzando il metodo Navigate del controllo o assegnato alla proprietà DocumentText del controllo.

    <button onclick="window.external.Test('called from script code')">
        call client code from script code
    </button>
    
  7. Implementate funzioni nel codice script che verrà usato dal tuo codice applicativo.

    L'elemento HTML SCRIPT seguente fornisce una funzione di esempio. Copiare questo codice nell'elemento HEAD di un documento HTML caricato utilizzando il metodo Navigate del controllo o assegnato alla proprietà DocumentText del controllo.

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

    Ad esempio, aggiungere il codice seguente a un pulsante Click gestore eventi.

    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
    
    webBrowser1.Document.InvokeScript("test", _
        New String() {"called from client code"})
    
  9. Al termine del debug del DHTML, impostare la proprietà ScriptErrorsSuppressed del controllo su true per impedire al controllo WebBrowser di visualizzare messaggi di errore per i problemi del codice 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

L'esempio di codice completo seguente fornisce un'applicazione dimostrativa che è possibile usare per comprendere questa funzionalità. Il codice HTML viene caricato nel controllo WebBrowser tramite la proprietà DocumentText anziché essere caricato da un file HTML separato.

using System;
using System.Windows.Forms;

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);
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        webBrowser1.AllowWebBrowserDrop = false;
        webBrowser1.IsWebBrowserContextMenuEnabled = false;
        webBrowser1.WebBrowserShortcutsEnabled = false;
        webBrowser1.ObjectForScripting = new MyScriptObject(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>";
    }

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

public class MyScriptObject
{
    private Form1 _form;

    public MyScriptObject(Form1 form)
    {
        _form = form;
    }

    public void Test(string message)
    {
        MessageBox.Show(message, "client code");
    }
}
Imports System.Windows.Forms

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

    Protected Overrides Sub OnLoad(e As EventArgs)
        MyBase.OnLoad(e)

        webBrowser1.AllowWebBrowserDrop = False
        webBrowser1.IsWebBrowserContextMenuEnabled = False
        webBrowser1.WebBrowserShortcutsEnabled = False
        webBrowser1.ObjectForScripting = New MyScriptObject(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

    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

Public Class MyScriptObject
    Private _form As Form1

    Public Sub New(ByVal form As Form1)
        _form = form
    End Sub

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

End Class

Compilazione del codice

Questo codice richiede:

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

Vedere anche