Sdílet prostřednictvím


Postupy: Implementace Two-Way komunikace mezi kódem DHTML a kódem klientské aplikace

Pomocí ovládacího prvku WebBrowser můžete do klientských aplikací Windows Forms přidat existující dynamický kód webové aplikace HTML (DHTML). To je užitečné, když jste investovali významnou dobu vývoje do vytváření ovládacích prvků založených na DHTML a chcete využít bohaté možnosti uživatelského rozhraní modelu Windows Forms, aniž byste museli přepisovat stávající kód.

Ovládací prvek WebBrowser umožňuje implementovat obousměrnou komunikaci mezi kódem klientské aplikace a skriptovacím kódem webové stránky prostřednictvím vlastností ObjectForScripting a Document. Kromě toho můžete nakonfigurovat ovládací prvek WebBrowser tak, aby se webové ovládací prvky bezproblémově prolínaly s jinými ovládacími prvky ve formuláři aplikace a skrývaly jejich implementaci DHTML. Pokud chcete bez problémů kombinovat ovládací prvky, naformátujte stránku tak, aby její barva pozadí a vizuální styl odpovídaly zbytku formuláře, a pomocí vlastností AllowWebBrowserDrop, IsWebBrowserContextMenuEnableda WebBrowserShortcutsEnabled zakažte standardní funkce prohlížeče.

Vložení DHTML do aplikace Windows Forms

  1. Nastavte vlastnost AllowWebBrowserDrop ovládacího prvku WebBrowser na false, aby ovládací prvek WebBrowser nemohl otevírat soubory přetažené na něj.

    webBrowser1.AllowWebBrowserDrop = false;
    
    webBrowser1.AllowWebBrowserDrop = False
    
  2. Nastavte vlastnost IsWebBrowserContextMenuEnabled ovládacího prvku na false, aby se ovládací prvek WebBrowser nezobrazil jeho místní nabídku, když na něj uživatel klikne pravým tlačítkem myši.

    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    
    webBrowser1.IsWebBrowserContextMenuEnabled = False
    
  3. Nastavte vlastnost WebBrowserShortcutsEnabled ovládacího prvku na false, aby ovládací prvek WebBrowser nereagoval na klávesové zkratky.

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. Nastavte vlastnost ObjectForScripting v konstruktoru formuláře nebo přepište metodu OnLoad.

    Následující kód používá samotnou třídu formuláře pro skriptovací objekt.

    webBrowser1.ObjectForScripting = new MyScriptObject(this);
    
    webBrowser1.ObjectForScripting = New MyScriptObject(Me)
    
  5. Implementujte skriptovací objekt.

    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. Pomocí objektu window.external ve skriptovacím kódu můžete přistupovat k veřejným vlastnostem a metodám zadaného objektu.

    Následující kód HTML ukazuje, jak volat metodu na skriptovací objekt z kliknutí na tlačítko. Zkopírujte tento kód do elementu BODY dokumentu HTML, který načtete pomocí Navigate metody ovládacího prvku nebo které přiřadíte k DocumentText vlastnosti ovládacího prvku.

    <button onclick="window.external.Test('called from script code')">
        call client code from script code
    </button>
    
  7. Implementujte funkce v kódu skriptu, který bude váš kód aplikace používat.

    Následující element HTML SCRIPT poskytuje ukázkovou funkci. Zkopírujte tento kód do elementu HEAD dokumentu HTML, který načtete pomocí Navigate metody ovládacího prvku nebo který přiřadíte k vlastnosti DocumentText ovládacího prvku.

    <script>
    function test(message) {
        alert(message);
    }
    </script>
    
  8. Pomocí vlastnosti Document získejte přístup k kódu skriptu z kódu klientské aplikace.

    Do obslužné rutiny události tlačítka Click přidejte například tento kód.

    webBrowser1.Document.InvokeScript("test",
        new String[] { "called from client code" });
    
    webBrowser1.Document.InvokeScript("test", _
        New String() {"called from client code"})
    
  9. Po dokončení ladění DHTML nastavte vlastnost ScriptErrorsSuppressed ovládacího prvku na true, aby ovládací prvek WebBrowser nezobrazil chybové zprávy pro problémy s kódem skriptu.

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

Příklad

Následující úplný příklad kódu obsahuje ukázkovou aplikaci, kterou můžete použít k pochopení této funkce. HTML kód se načítá do ovládacího prvku WebBrowser prostřednictvím vlastnosti DocumentText místo toho, aby byl načten ze samostatného souboru 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

Kompilace kódu

Tento kód vyžaduje:

  • Odkazy na sestavení System a System.Windows.Forms.

Viz také