Udostępnij za pośrednictwem


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

  1. 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
    
  2. 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
    
  3. Ustaw właściwość WebBrowserShortcutsEnabled kontrolki na false, aby zapobiec reagowaniu kontrolki WebBrowser na skróty.

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. 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)
    
  5. 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
    
  6. 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>
    
  7. 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>
    
  8. 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"})
    
  9. 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ż