首页 > 解决方案 > 在 Windows 窗体应用程序中使用 CefSharp 从 javaScript 调用 C# 函数

问题描述

如何在 Windows 窗体应用程序中从 JAVASCRIPT(在 HTML 代码中,我通过 CefSharp 调用)调用 C# 函数

CefSharp 组件

public partial class Form1 : Form
{
    public ChromiumWebBrowser chromeBrowser;

    public Form1()
    {
        InitializeComponent();

        // Start the browser after initialize global component
        InitializeChromium();
    }

    public void InitializeChromium()
    {

        CefSettings settings = new CefSettings();

        settings.CefCommandLineArgs.Add("enable-media-stream", "1");

        Cef.Initialize(settings);

        chromeBrowser = new ChromiumWebBrowser("localhost/myproject/index.html");

        this.Controls.Add(chromeBrowser);

        chromeBrowser.Dock = DockStyle.Fill;
    }
}

JS调用的函数

public void Test(String message)
{
    MessageBox.Show(message, "Test");
}

我需要在 onclick 事件中调用 Test() 的 HTML 代码

<span class="mySpan" onclick="<Some>.Test('It is working');"></span>

我试过的代码,

InitializeChromium 函数内部

CefSharpSettings.LegacyJavascriptBindingEnabled = true;

chromeBrowser.RegisterAsyncJsObject("boundAsync", new BoundObject());

绑定对象.cs

public class BoundObject
{
    public void Test(String message)
    {
        MessageBox.Show(message, "Test");
    }
}

代码

<span class="mySpan" onclick="boundAsync.Test('It is working');"></span>

但这对我不起作用。请让我知道我错在哪里?

提前致谢!

标签: javascriptc#cefsharp

解决方案


这是一个教程 http://windowsapptutorials.com/wpf/call-c-sharp-javascript-using-cefsharp-wpf-app/

1. 使用要调用的方法创建一个类

创建一个 CallbackObjectForJs 类,其中包含将从 javascript 调用的 showMessage 函数。

public class CallbackObjectForJs{
    public void showMessage(string msg){//Read Note
        MessageBox.Show(msg);
    }
}

2.注册JS对象

下一步是注册 JS 对象。这可以通过在MainPage.xaml.cs文件中添加以下代码来完成。

private CallbackObjectForJs _callBackObjectForJs;
public MainWindow()
{
    InitializeComponent();
    _callBackObjectForJs= new CallbackObjectForJs();
    ChromiumWebBrowser.RegisterAsyncJsObject("callbackObj", _callBackObjectForJs);
}

3. 从 JavaScript 调用 C# 函数

接下来,只需从您的 javascript 代码中调用 C# 函数。

<script>
    callbackObj.showMessage("Hello World!");
</script>

注意: C# 函数的名称应以小写字母开头。


替代解决方案,如建议的@amaitland

向浏览器实例添加事件监听器:

public MainWindow()
{
    InitializeComponent();
    
    //Initialize ChromiumWebBrowser
    
    //Hook up event
    browser.JavascriptMessageReceived += OnBrowserJavascriptMessageReceived;
}

private void OnBrowserJavascriptMessageReceived(object sender, JavascriptMessageReceivedEventArgs e)
{
    var windowSelection = (string)e.Message;
    //DO SOMETHING WITH THIS MESSAGE
    //This event is called on a CEF Thread, to access your UI thread
    //You can cast sender to ChromiumWebBrowser
    //use Control.BeginInvoke/Dispatcher.BeginInvoke
}

从 javascript 调用方法(在上下文CefSharp.PostMessage中自动可用:ChromiumWebBrowser

//CefSharp.PostMessage can be used to communicate between the browser
//and .Net, in this case we pass a simple string,
//complex objects are supported, passing a reference to Javascript methods
//is also supported.
CefSharp.PostMessage(window.getSelection().toString());

推荐阅读