Porady: implementowanie dwukierunkowej komunikacji między kodem DHTML i kodem aplikacji klienta
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 internetowej za pomocą ObjectForScripting właściwości i Document . Ponadto możesz skonfigurować kontrolkę WebBrowser tak, aby kontrolki sieci Web bezproblemowo mieszały się z innymi kontrolkami w formularzu aplikacji, ukrywając implementację DHTML. Aby bezproblemowo mieszać kontrolki, sformatuj wyświetloną stronę, aby jej kolor tła i styl wizualny odpowiadał pozostałej części formularza, a następnie użyj AllowWebBrowserDropwłaściwości , IsWebBrowserContextMenuEnabledi WebBrowserShortcutsEnabled , aby wyłączyć standardowe funkcje przeglądarki.
Aby osadzić kod DHTML w aplikacji Windows Forms
WebBrowser Ustaw właściwość kontrolkiAllowWebBrowserDrop, aby uniemożliwić
false
WebBrowser jej otwieranie plików.webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.AllowWebBrowserDrop = False
Ustaw właściwość kontrolki IsWebBrowserContextMenuEnabled , aby uniemożliwić
false
kontrolki WebBrowser wyświetlanie menu skrótów po kliknięciu jej prawym przyciskiem myszy.webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.IsWebBrowserContextMenuEnabled = False
Ustaw właściwość kontrolki WebBrowserShortcutsEnabled , aby
false
uniemożliwić kontrolce WebBrowser odpowiadanie na klawisze skrótów.webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = False
ObjectForScripting Ustaw właściwość 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 w kodzie skryptowym
window.external
, 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 ładowanego przy użyciu metody kontrolki Navigate lub przypisanej do właściwości kontrolki DocumentText .
<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 ładowanego przy użyciu metody kontrolki Navigate lub przypisanej do właściwości kontrolki DocumentText .
<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ść kontrolki, aby uniemożliwić
true
kontrolce ScriptErrorsSuppressedWebBrowser wyświetlanie komunikatów o błędach 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 DocumentText właściwości, 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łania do zestawów System i System.Windows.Forms.
Zobacz też
.NET Desktop feedback
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla