关于wpf的CefSharp嵌入网页,与angularjs交互问题

tj_libo 2020-11-18 01:42:00
H5网页放一个登陆按钮,angularjs中

$scope.login = function () {
window['wpfToAngularObj'].angularToWPF('123');
}
wpf#

CefSharpSettings.LegacyJavascriptBindingEnabled = true;
webView.JavascriptObjectRepository.Register("boundAsync", new WPFAngularObj(), isAsync: true, options: BindingOptions.DefaultBinder);
webView.Address = "http://localhost:8999/home.html#/login";


public class WPFAngularObj
{
public void angularToWPF(string msg)
{
MessageBox.Show(msg);
}
}

一直无法调用到wpf的方法。CefSharp提示Cannot read property 'angularToWPF' of undefined 找不到angularToWPF
...全文
1096 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2020-11-20
  • 打赏
  • 举报
回复
对于内嵌浏览器,然后使用Web Socket 这个技术,来完成 js 与 c# 之间的通信这个场景,
浏览器宿主进程才是 Server,也就是你的 WPF程序是 Server

访问需要 js 与 c# 交互的页面的时候,url加个参数,类似:?wsUrl=ws://localhost:12345 (之前用于 qt web channel 的,不知道其他语言的是不是一样)
乱臣贼子 2020-11-19
  • 打赏
  • 举报
回复
亲,你注册的对象的名称是:boundAsync;你在JS中,却使用window['wpfToAngularObj'] 去访问这个对象。找不到是正常的
八爻老骥 2020-11-18
  • 打赏
  • 举报
回复
引用 13 楼 tj_libo 的回复:
js设置断点看 window['sayChart']一直是undefined,导致wpf函数根本无法访问到

如此试试:

window.sayChart.sayChart("11123123123");
  • 打赏
  • 举报
回复
引用 3 楼 tj_libo 的回复:
wpf程序需要安装在多台工控机上,socket不可取


web和 wcf 都是客户端,你应该自己设计一个“服务器”软件,网页通过websocket 连服务器,wpf可以通过tcp连服务器。并且控制流程以服务器为核心。
  • 打赏
  • 举报
回复
使用 c# 加上一些 html+css 知识,你可以使用 .net 中的知识,例如 linq 等等传统,和 ClientWebSocket 等等 .net 5 新加入的标准库。
  • 打赏
  • 举报
回复
整个 h5 开发可以使用 c# 而不是 js。微软已经正式发布了 .net 5,你可以放心使用 webassembly,用 .net standard 框架和 c# 编写网页,用 blazor (或者你可以参考一下 blazor 编译成的 dll 可通过 nuget 发布的网页控件原始源代码)来设计和绑定模板。

注意,不用 js。
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
js设置断点看 window['sayChart']一直是undefined,导致wpf函数根本无法访问到
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
我同事刚刚接触angularJS,现在让他们弄angularJS的websocket,有些难度,程序整体架构就是h5+angularJS,需要在工控机打开页面并且通过modbus控制工控机上的五色灯。所以采用wpf+CefSharp
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
TypeError: window.sayChart.sayChart is not a function js:$scope.login = function () { //window.external.ShowMsg("123123123"); window['sayChart'].sayChart("11123123123");}; wpf: webView.JavascriptObjectRepository.Register("sayChart", new CallbackObjectForJs(), isAsync: false, options: BindingOptions.DefaultBinder); webView.Address = "http://localhost:8999/home.html#/login"; public class CallbackObjectForJs { public string name = ""; //方法可有返回值 public object getChartData(string table) { return new List<string> { "a", "b", "c" }; } //方法可没返回值 public void sayChart(string str) { System.Windows.MessageBox.Show(str); } } 依然无法调用到wpf的方法。
wanghui0380 2020-11-18
  • 打赏
  • 举报
回复
这套玩意对nodejs开发的也是一样的,那是用啥winform,wpf,qt操作页面哦。 他们就是开发一个网站,用npm启动一个内置本地网站。用cef展示而已
wanghui0380 2020-11-18
  • 打赏
  • 举报
回复
你只需要开服务的约定好端口号和你们需要交换的数据通讯协议格式就成了 现在你不用管aue,angrljs那边了,他们自己就能搞定。你不过是那cef显示。 当然你用Cef本地文件系统承载,可以。其实把很多情况是我们直接用owin self host直接内置一个本地web,所以你的什么asp mvc webapi都可以直接用上(当然现在是owin +asp.net mvc core)那么你其实根本就不需要关注wpf部分,那就是壳子只是外套,本质上他就是个网站开发
wanghui0380 2020-11-18
  • 打赏
  • 举报
回复
引用 5 楼 tj_libo 的回复:
wpf的CefSharp内有web页面,页面上几个按钮控制工控机的几个按钮,所以wpf在工控机需要modbus通讯,总不能每次安装都要设置一边socket的服务IP吧,
额 1.是websocket,不是socket 2.是本机回环地址127.0.0.1,不是网络地址(这玩意连网卡都不走,应该直接走管道或者pci 总线消息了) 你不用纠结,文章是2020年的,不是你看的5,6年前的。这东西你不用,Google都用。现在做自动化网页测试的google两款工具,其实就是websocket和无头协议控制,不然想你这样来回注入对方脚本,玩自动化测试的兄弟还不得天天加班哦
八爻老骥 2020-11-18
  • 打赏
  • 举报
回复
明显没索引到window['wpfToAngularObj']啊,注册的名称,跟这个索引键不一致。
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
自己顶,别沉了,在线等
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
wpf的CefSharp内有web页面,页面上几个按钮控制工控机的几个按钮,所以wpf在工控机需要modbus通讯,总不能每次安装都要设置一边socket的服务IP吧,
晨易夕 2020-11-18
  • 打赏
  • 举报
回复
既然用了CefSharp,那就是前端是前端的事,后台是后台的事了,可以把websocket看成两个互不相干的进程通信。
tj_libo 2020-11-18
  • 打赏
  • 举报
回复
wpf程序需要安装在多台工控机上,socket不可取
wanghui0380 2020-11-18
  • 打赏
  • 举报
回复
不想找啥严谨的代码,随手百度一下,随手点开一篇,代码不复杂,是那个意思,至少没啥明显毛病 https://blog.csdn.net/glmushroom/article/details/107859484
wanghui0380 2020-11-18
  • 打赏
  • 举报
回复
生活简单,代码简单点也许你更快乐 wpf里嵌入一个websocket 服务端,就可以了。各做各的, 不要想你插入我的代码,我插入你的代码。那样你会很不快乐的

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧