Udostępnij przez


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

  1. WebBrowser Ustaw właściwość kontrolkiAllowWebBrowserDrop, aby uniemożliwić falseWebBrowser jej otwieranie plików.

    webBrowser1.AllowWebBrowserDrop = false;
    
    webBrowser1.AllowWebBrowserDrop = False
    
  2. 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
    
  3. Ustaw właściwość kontrolki WebBrowserShortcutsEnabled , aby false uniemożliwić kontrolce WebBrowser odpowiadanie na klawisze skrótów.

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. 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)
    
  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 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>
    
  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 ładowanego przy użyciu metody kontrolki Navigate lub przypisanej do właściwości kontrolki DocumentText .

    <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ść 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ż