Instrukcje: implementowanie komunikacji Two-Way między kodem DHTML i kodem aplikacji klienckiej
Możesz użyć kontrolki WebBrowser, aby dodać istniejący dynamiczny kod aplikacji internetowej HTML (DHTML) do aplikacji klienckich windows Forms. Jest to przydatne, gdy zainwestowano znaczący czas programowania w tworzenie kontrolek opartych na protokole DHTML i chcesz korzystać z zaawansowanych funkcji interfejsu użytkownika formularzy systemu Windows bez konieczności ponownego pisania istniejącego kodu.
Kontrolka WebBrowser umożliwia zaimplementowanie dwukierunkowej komunikacji między kodem aplikacji klienckiej a kodem skryptowym strony sieci Web za pomocą właściwości ObjectForScripting i Document. Ponadto można skonfigurować kontrolkę WebBrowser, aby kontrolki sieci Web bezproblemowo mieszały się z innymi kontrolkami w formularzu aplikacji, ukrywając implementację DHTML. Aby bezproblemowo mieszać kontrolki, sformatuj wyświetlaną stronę, aby jej kolor tła i styl wizualny odpowiadał pozostałej części formularza, a następnie użyj właściwości AllowWebBrowserDrop, IsWebBrowserContextMenuEnabledi WebBrowserShortcutsEnabled, aby wyłączyć standardowe funkcje przeglądarki.
Aby osadzić kod DHTML w aplikacji Windows Forms
Ustaw właściwość AllowWebBrowserDrop elementu sterującego WebBrowser na
false
, aby uniemożliwić kontrolce WebBrowser otwieranie plików, które zostały na nią przeciągnięte.webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.AllowWebBrowserDrop = False
Ustaw właściwość IsWebBrowserContextMenuEnabled kontrolki na
false
, aby uniemożliwić kontrolce WebBrowser wyświetlanie menu skrótów, gdy użytkownik kliknie ją prawym przyciskiem myszy.webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = False
Ustaw właściwość WebBrowserShortcutsEnabled kontrolki na
false
, aby zapobiec reagowaniu kontrolki WebBrowser na skróty.webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = False
Ustaw właściwość ObjectForScripting w konstruktorze formularza lub przesłoń metodę OnLoad.
Poniższy kod używa samej klasy formularza dla obiektu skryptowego.
webBrowser1.ObjectForScripting = new MyScriptObject(this);
webBrowser1.ObjectForScripting = New MyScriptObject(Me)
Zaimplementuj obiekt skryptów.
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
Użyj obiektu
window.external
w kodzie skryptowym, aby uzyskać dostęp do właściwości publicznych i metod określonego obiektu.Poniższy kod HTML pokazuje, jak wywołać metodę na obiekcie skryptowym za pomocą kliknięcia przycisku. Skopiuj ten kod do elementu BODY dokumentu HTML, który ładujesz za pomocą metody Navigate kontrolki lub który przypisujesz do właściwości DocumentText kontrolki.
<button onclick="window.external.Test('called from script code')"> call client code from script code </button>
Zaimplementuj funkcje w kodzie skryptu, którego będzie używać kod aplikacji.
Poniższy element SKRYPT HTML udostępnia przykładową funkcję. Skopiuj ten kod do elementu HEAD dokumentu HTML, który ładujesz za pomocą metody Navigate kontrolki lub przypisujesz do właściwości DocumentText tej kontrolki.
<script> function test(message) { alert(message); } </script>
Użyj właściwości Document, aby uzyskać dostęp do kodu skryptu z kodu aplikacji klienckiej.
Na przykład dodaj następujący kod do procedury obsługi zdarzeń przycisku Click.
webBrowser1.Document.InvokeScript("test", new String[] { "called from client code" });
webBrowser1.Document.InvokeScript("test", _ New String() {"called from client code"})
Po zakończeniu debugowania kodu DHTML ustaw właściwość ScriptErrorsSuppressed kontrolki na
true
, aby zapobiec wyświetlaniu komunikatów o błędach WebBrowser w przypadku problemów z kodem skryptu.// Uncomment the following line when you are finished debugging. //webBrowser1.ScriptErrorsSuppressed = true;
' Uncomment the following line when you are finished debugging. 'webBrowser1.ScriptErrorsSuppressed = True
Przykład
Poniższy kompletny przykład kodu zawiera demonstracyjną aplikację, której można użyć do zrozumienia tej funkcji. Kod HTML jest ładowany do kontrolki WebBrowser za pośrednictwem właściwości DocumentText, a nie ładowany z oddzielnego pliku HTML.
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
Kompilowanie kodu
Ten kod wymaga:
- Odwołań do zestawów System i System.Windows.Forms.
Zobacz też
.NET Desktop feedback