Procedura: implementare comunicazioni bidirezionali tra il codice DHTML e il codice dell'applicazione client
È possibile usare il controllo WebBrowser per aggiungere codice HTML dinamico (DHTML) dell'applicazione Web esistente alle applicazioni client Windows Form. Questa procedura è utile quando in fase di sviluppo si è investito molto tempo 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. È anche 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 usare le proprietà AllowWebBrowserDrop, IsWebBrowserContextMenuEnabled e WebBrowserShortcutsEnabled per disabilitare le funzionalità standard del browser.
Per incorporare il codice DHTML in un'applicazione Windows Forms
Impostare la proprietà WebBrowser del controllo AllowWebBrowserDrop su
false
per impedire a WebBrowser di aprire i file rilasciati nel controllo.webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.AllowWebBrowserDrop = False
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
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
Impostare la ObjectForScripting proprietà nel costruttore del modulo o eseguire l'override del OnLoad metodo .
Il codice seguente usa la classe del form per l'oggetto script.
webBrowser1.ObjectForScripting = new MyScriptObject(this);
webBrowser1.ObjectForScripting = New MyScriptObject(Me)
Implementare l'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
Usare l'oggetto
window.external
nel codice di script per accedere alle proprietà e ai metodi pubblici dell'oggetto specificato.Il codice HTML riportato di seguito dimostra 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>
Implementare funzioni nel codice di script che verrà usato 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>
Usare la proprietà Document per accedere al codice di script dal codice dell'applicazione client.
Ad esempio, aggiungere il codice seguente al gestore eventi di un pulsante Click.
webBrowser1.Document.InvokeScript("test", new String[] { "called from client code" });
webBrowser1.Document.InvokeScript("test", _ New String() {"called from client code"})
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
L'esempio di codice completo riportato di seguito illustra un'applicazione di prova che può essere usata 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.
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
Per questo codice sono necessari i requisiti seguenti:
- Riferimenti agli assembly System e System.Windows.Forms.
Vedi anche
.NET Desktop feedback