Freigeben über


Vorgehensweise: Implementieren Two-Way Kommunikation zwischen DHTML-Code und Clientanwendungscode

Sie können das WebBrowser Steuerelement verwenden, um vorhandenen DHTML-Webanwendungscode (Dynamic HTML) zu Ihren Windows Forms-Clientanwendungen hinzuzufügen. Dies ist nützlich, wenn Sie erhebliche Entwicklungszeit beim Erstellen von DHTML-basierten Steuerelementen investiert haben und die umfangreichen Benutzeroberflächenfunktionen von Windows Forms nutzen möchten, ohne vorhandenen Code neu schreiben zu müssen.

Mit dem WebBrowser Steuerelement können Sie die bidirektionale Kommunikation zwischen dem Clientanwendungscode und dem Webseite-Skriptcode über die Eigenschaften ObjectForScripting und Document implementieren. Darüber hinaus können Sie das WebBrowser Steuerelement so konfigurieren, dass Ihre Websteuerelemente nahtlos mit anderen Steuerelementen in Ihrem Anwendungsformular kombiniert werden und ihre DHTML-Implementierung ausblenden. Um die Steuerelemente nahtlos zu kombinieren, formatieren Sie die angezeigte Seite so, dass die Hintergrundfarbe und die visuelle Formatvorlage mit dem Rest des Formulars übereinstimmen, und verwenden Sie die AllowWebBrowserDrop, IsWebBrowserContextMenuEnabledund WebBrowserShortcutsEnabled die Eigenschaften, um Standardbrowserfeatures zu deaktivieren.

So betten Sie DHTML in Ihre Windows Forms-Anwendung ein

  1. Legen Sie die Eigenschaft des WebBrowser Steuerelements AllowWebBrowserDrop fest, damit die Dateien, die darauf abgelegt werden, nicht vom false Steuerelement geöffnet werden.

    webBrowser1.AllowWebBrowserDrop = false;
    
    webBrowser1.AllowWebBrowserDrop = False
    
  2. Legen Sie die Eigenschaft des IsWebBrowserContextMenuEnabled Steuerelements auf false fest, um zu verhindern, dass das WebBrowser Steuerelement sein Shortcut-Menü anzeigt, wenn der Benutzer mit der rechten Maustaste darauf klickt.

    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    
    webBrowser1.IsWebBrowserContextMenuEnabled = False
    
  3. Setzen Sie die Eigenschaft des Steuerelements WebBrowserShortcutsEnabled auf false, um zu verhindern, dass das Steuerelement WebBrowser auf Tastenkombinationen reagiert.

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. Legen Sie die ObjectForScripting Eigenschaft im Konstruktor des Formulars fest, oder setzen Sie die OnLoad Methode außer Kraft.

    Der folgende Code verwendet die Formularklasse selbst für das Skriptobjekt.

    webBrowser1.ObjectForScripting = new MyScriptObject(this);
    
    webBrowser1.ObjectForScripting = New MyScriptObject(Me)
    
  5. Implementieren Sie Ihr Skriptobjekt.

    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. Verwenden Sie das window.external Objekt in Ihrem Skriptcode, um auf öffentliche Eigenschaften und Methoden des angegebenen Objekts zuzugreifen.

    Der folgende HTML-Code veranschaulicht, wie eine Methode für das Skriptobjekt von einem Schaltflächenklick aufgerufen wird. Kopieren Sie diesen Code in das BODY-Element eines HTML-Dokuments, das Sie mit der Methode des Steuerelements Navigate laden oder der Eigenschaft des Steuerelements DocumentText zuweisen.

    <button onclick="window.external.Test('called from script code')">
        call client code from script code
    </button>
    
  7. Implementieren Sie Funktionen in Ihrem Skriptcode, den Der Anwendungscode verwendet.

    Das folgende HTML SCRIPT-Element stellt eine Beispielfunktion bereit. Kopieren Sie diesen Code in das HEAD-Element eines HTML-Dokuments, das Sie mit der Methode des Steuerelements Navigate laden oder der Eigenschaft des Steuerelements DocumentText zuweisen.

    <script>
    function test(message) {
        alert(message);
    }
    </script>
    
  8. Verwenden Sie die Document Eigenschaft, um über den Clientanwendungscode auf den Skriptcode zuzugreifen.

    Fügen Sie beispielsweise den folgenden Code zu einem Schaltflächenereignishandler Click hinzu.

    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
    
    webBrowser1.Document.InvokeScript("test", _
        New String() {"called from client code"})
    
  9. Wenn Sie mit dem Debuggen von DHTML fertig sind, setzen Sie die Eigenschaft des Steuerelements ScriptErrorsSuppressed auf true, um zu verhindern, dass das WebBrowser-Steuerelement Fehlermeldungen bezüglich Problemen im Skriptcode anzeigt.

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

Beispiel

Im folgenden vollständigen Codebeispiel wird eine Demoanwendung bereitgestellt, die Sie verwenden können, um dieses Feature zu verstehen. Der HTML-Code wird über die WebBrowser Eigenschaft in das DocumentText Steuerelement geladen, anstatt aus einer separaten HTML-Datei geladen zu werden.

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

Code kompilieren

Dieser Code erfordert Folgendes:

  • Verweise auf die Assemblys „System“ und „System.Windows.Forms“.

Siehe auch