从 CefSharp 1 中的 javascript 调用 .Net - wpf
Posted
技术标签:
【中文标题】从 CefSharp 1 中的 javascript 调用 .Net - wpf【英文标题】:Call .Net from javascript in CefSharp 1 - wpf 【发布时间】:2014-06-18 22:56:49 【问题描述】:我刚刚学习C# WPF,已经成功实现了CefSharp,如何从CefSharp中加载的javascript调用.NET函数?
【问题讨论】:
【参考方案1】:-
通过 WebView 构造 WebView webView = new WebView(url)
然后就可以调用RegisterJsObject方法注册一个js对象了。
使用javascript调用这个js对象。
示例如下:
public class CallbackObjectForJs
public void showMessage(string msg)//Read Note
MessageBox.Show(msg);
WebView webView = new WebView("http://localhost:8080");
webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());
前端的javascript代码:
<script type="text/javascript">
callbackObj.showMessage('message from js');
</script >
注意:CallbackObjectForJs 的 showMessage 方法的第一个字符不能在上面
【讨论】:
未实现 CefSharp 33.0.0 中发生异常。任何人都知道这可能何时实施。下一个版本? @CaptainBli 现在好像已移至Cef.RegisterJsObject
【参考方案2】:
首先在 C# 中创建一个公共类,如下所示:
public class cShaarp_Js
public void calledFromJs(Object object)
然后你应该将这个类注册到你的 chromeBrowser。
chromeBrowser = new ChromiumWebBrowser("file:///C:/sample.html");
chromeBrowser.RegisterJsObject("csharp", new cShaarp_Js);
现在我们完成了 C#。在 javascript 的另一边,你可以创建一个回调到这个类,如下所示:
function cSharpMetodCall()csharp.calledFromJs(object);
【讨论】:
【参考方案3】:由于Chromium
更改以63.0.0
开头,因此Javascript Binding
发生了重大更改。旧行为仍然适用于 Single Page Applications
并且仅使用单个域。
新的绑定方法
新的绑定方式有很多优点:
按名称绑定和取消绑定对象 将对象子集绑定到不同的页面(包括弹出窗口) 删除/取消绑定方法 动态解析绑定对象简单示例:
public class BoundObject
public void showMessage(string msg)
MessageBox.Show(msg);
browser.JavascriptObjectRepository.Register("boundAsync", new BoundObject(), true);
<script type="text/javascript">
(async function()
await CefSharp.BindObjectAsync("boundAsync", "bound");
boundAsync.showMessage('Message from JS');
)();
</script>
更多详情请访问Javascript Binding v2 #2246和How do you expose a .NET class to JavaScript?
旧版绑定
如果您执行跨站点导航,您将无法再使用此方法绑定对象。
您需要在注册第一个对象 (RegisterAsyncJsObject
) 之前设置 CefSharpSettings.LegacyJavascriptBindingEnabled = true
。
简单示例:
public class BoundObject
public void showMessage(string msg)
MessageBox.Show(msg);
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
browser.RegisterAsyncJsObject("boundAsync", new BoundAsyncObject());
<script type="text/javascript">
boundAsync.showMessage('Message from JS');
</script>
更多详情请访问Javascript Binding v2 #2246和How do you expose a .NET class to JavaScript?
【讨论】:
“新绑定方法”部分的绝佳答案。简单,晶莹剔透,像魅力一样工作:)以上是关于从 CefSharp 1 中的 javascript 调用 .Net - wpf的主要内容,如果未能解决你的问题,请参考以下文章
WinForms 中的 CefSharp - ExecuteScriptAsync 或 EvaluateScriptAsync 不起作用