Sdílet prostřednictvím


Postupy: Implementace obousměrné komunikace mezi kódem DHTML a kódem klientské aplikace

Ovládací prvek můžete použít WebBrowser k přidání existujícího dynamického kódu webové aplikace HTML (DHTML) do model Windows Forms klientských aplikací. 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í model Windows Forms bez nutnosti přepisovat stávající kód.

Ovládací WebBrowser prvek umožňuje implementovat obousměrnou komunikaci mezi kódem klientské aplikace a skriptovacím kódem webové stránky prostřednictvím ObjectForScripting vlastností a Document vlastností. Kromě toho můžete ovládací prvek nakonfigurovat WebBrowser tak, aby se webové ovládací prvky hladce prolínaly s jinými ovládacími prvky ve formuláři aplikace a skrývaly jejich implementaci DHTML. Chcete-li 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í AllowWebBrowserDropIsWebBrowserContextMenuEnabled, a WebBrowserShortcutsEnabled vlastnosti zakázat standardní funkce prohlížeče.

Vložení DHTML do aplikace model Windows Forms

  1. WebBrowser Nastavte vlastnost ovládacího prvku tak, aby false ovládací prvek AllowWebBrowserDrop nemohl WebBrowser otevírat soubory, které na něj byly vyřazeny.

    webBrowser1.AllowWebBrowserDrop = false;
    
    webBrowser1.AllowWebBrowserDrop = False
    
  2. Nastavte vlastnost ovládacího prvku tak, aby false ovládací prvek IsWebBrowserContextMenuEnabled nezobrazil WebBrowser 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 ovládacího prvku tak, aby false ovládací prvek WebBrowserShortcutsEnabled nereagoval WebBrowser na klávesové zkratky.

    webBrowser1.WebBrowserShortcutsEnabled = false;
    
    webBrowser1.WebBrowserShortcutsEnabled = False
    
  4. ObjectForScripting Nastavte vlastnost v konstruktoru formuláře nebo přepsat metoduOnLoad.

    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. window.external Objekt ve skriptovacím kódu použijte pro přístup 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í metody ovládacího prvku Navigate nebo který přiřadíte k vlastnosti ovládacího prvku DocumentText .

    <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í metody ovládacího prvku Navigate nebo který přiřadíte k vlastnosti ovládacího prvku DocumentText .

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

    Přidejte například následující kód do obslužné rutiny události tlačítka Click .

    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 ovládacího prvku ScriptErrorsSuppressed tak, aby true ovládací prvek nezobrazil WebBrowser zobrazování chybových zpráv 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. Kód HTML se načte do WebBrowser ovládacího prvku prostřednictvím DocumentText vlastnosti místo 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

Probíhá kompilace kódu

Tento kód vyžaduje:

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

Viz také