javascript - 在 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>
但这对我不起作用。请让我知道我错在哪里?
提前致谢!
解决方案
这是一个教程 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());
推荐阅读
- javascript - 键入两个具有相同类型的对象
- oop - 使用“覆盖”关键字
- javascript - 如何在Vuejs中选中所有复选框?
- python-3.x - 当我在代码中引入产量时,它在 python 中不起作用
- html - 带有看不见的标签的可访问性
- python - RelatedObjectDoesNotExist at /login/ 用户没有个人资料
- c# - 如何使用日期格式获取每月的第一个星期日?
- python - 用于 csv 文件的 Jupyter Notebook 选择 3 个窗口滚动
- reactjs - 无法读取未知错误的属性映射
- graphql - GraphQL 联合:如何消费,而不是扩展