Frage

Ich habe ein Formular, das ein Webbrowser-Steuerelement enthält.Dieses Browser-Steuerelement lädt etwas HTML von der Festplatte und zeigt es an.Ich möchte in meinem Formular eine Schaltfläche im HTML-Zugriff auf C#-Code haben.

Beispielsweise könnte eine Schaltfläche im HTML die Close()-Methode im Formular aufrufen.

Zielplattform:C# und Windows Forms (jede Version)

War es hilfreich?

Lösung

Sehen Sie sich die WebBrowser.ObjectForScripting Eigenschaft. Managed zu Google Maps erhalten im Gespräch mit einer Windows Forms-Anwendung diese verwendet wird.

Andere Tipps

Ich habe dies in einigen Anwendungen in der Vergangenheit implemeted, hier wie folgt vor:. (NB: das folgende Beispiel nicht die Produktion bereit ist, und sollte nur als Richtwert verwendet werden)

Zuerst eine normale .NET-Klasse (public) erstellen, die öffentliche Methoden enthält, die Sie wollen von Javasvcipt rufen in Ihrem Web-Browser-Steuerung ausgeführt wird.

Am wichtigsten ist es mit dem ComVisible (true)] Attribute aus dem System.Runtime.InteropServices-Namespace eingerichtet werden (Javascript in IE ist COM basierte). Man kann alles genannt, ich habe es „Extern“ genannt, um die Dinge klarer.

using System.Runtime.InteropServices;

[ComVisible(true)]
public class External
{
    private static MainWindow m_mainWindow = null;

    public External(MainWindow mainWindow)
    {
        m_mainWindow = mainWindow; 
    }

    public void CloseApplication()
    {
        m_mainWindow.Close();
    }


    public string CurrentDate(string format)
    {
        return DateTime.Now.ToString(format);  
    }
}

Als nächstes wird in der .NET-Formular mit Ihren Web-Browser-Steuerelement eine Instanz der Klasse ComVisible erstellen, setzen Sie dann den Webbrowser steuert ObjectForScripting zu dieser Instanz:

    private void MainWindow_Load(object sender, EventArgs e)
    {
         m_external = new External(this);

         browserControl.ObjectForScripting = m_external; 
    }

Schließlich in Ihrem Javascript in Ihrem Webbrowser Steuerung ausgeführt wird, Sie Zugriff auf die .NET-Methoden über das window.external Objekt. In diesem Fall window.external eigentlich Referenzen (indirekt über einen COM-Interop-Wrapper) das „Extern“ Objekt erstellt oben:

// Javascript code
function CloseButton_Click()
{
    if (window.external)
    {
        window.external.CloseApplication();
    }
}

Bitte beachten Sie, dass von Javascript ruft .NET über die COM-Interop-Schicht übergeben und so der Standard-Schnittstelle abfragt, Rangier- von Parametern usw. auftreten müssen. Mit anderen Worten kann es relativ langsam sein, so einige Performance-Tests tun, wenn Sie innerhalb einer Schleife mehrere Anrufe beispielsweise machen möchten.

Auch nur für die Zukunft, rufen JavaScript-Code von .NET ist einfacher, benutzen Sie einfach die Document.InvokeScript Methode:

    browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });

Was ich in VB6 gemacht habe:

  • Fügen Sie dem HTML-Dokument eine Reihe benutzerdefinierter <A>-Tags hinzu und setzen Sie deren href auf etwas, das für Sie von Bedeutung ist, z. B. „#closeform“.
  • Überprüfen Sie bei der BeforeNavigate-Methode die Adresse, zu der der Browser zu gelangen versucht, und handeln Sie entsprechend.Brechen Sie dann die Browsernavigation ab.

Alles, was Sie tun müssen, ist einen Ereignishandler für das WebBrowser der Navigating-Ereignis hinzuzufügen.

Dieses Ereignis wird ausgelöst, bevor der Browser auf die nächste Seite navigiert. Es ermöglicht Ihnen, den Prozess zu unterbrechen und tun, was Sie wollen, einschließlich der Navigation Cancelling und ruft in den Code.

Pretty einfach zu bedienen. Die einzige Einschränkung die ich kenne ist, dass Sie nicht die Postdata sehen können - siehe meine Frage hier: Postdata Frage

zuzugreifen

Hier ist ein Beispielcode:

    private void MyMethod()
    {
        // do something
    }

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        MyMethod();
        e.Cancel = true;
    }

Das ist möglich, aber ich habe es nicht in .NET getan. Vor ein paar Jahren hatte ich eine C ++ Anwendung, die ein Web-Browser-Steuerelement (ActiveX) gehostet. Von dem HTML-Code in der Steuerung war es möglich, nennen ‚out‘ zu dem ActiveX-Steuerelement und bekommt es Dinge zu tun.

Dies sollte auch in .NET möglich sein, obwohl HTML DOM / JavaScript wird nicht über C # wissen. Aber wenn Sie Ihre .NET-Funktionalität in einem COM-Objekt wickeln, sollten Sie in der Lage sein, Methoden aufrufen auf dem COM / ActiveX-Objekte, die in-turn C # -Code aufrufen.

Hope, das hilft.

habe ich das vor einigen Jahren, und darüber gebloggt hier:

http://matthewskelton.wordpress.com/2007 / 04/21 / rufenden Javascript-from-c /

Insbesondere können Sie Type.InvokeMember() verwenden JavaScript von C # zu nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top