原文:
wpf CefSharp 與 js互動通過 NuGet 擷取 CefSharp.WpF 元件。
xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf" //加載
需要把項目的 cpu 設定成 x86 ,Framework4.5
//使用控件
<cefSharp:ChromiumWebBrowser Name="mychrome"></cefSharp:ChromiumWebBrowser>
this.mychrome.MenuHandler = new MenuHandler(); //去掉右鍵菜單 需要實作 IContextMenuHandler 這個接口
this.mychrome.Address = @"url";
this.mychrome.RegisterJsObject("JsObj", new CallbackObjectForJs(),false); //帶false 可以識别大寫字母開頭的函數或變量
// this.mychrome.RegisterJsObject("JsObj", new CallbackObjectForJs()); //不帶 false 不能識别大寫字母開頭的函數或變量
//注 引用文章 這個也是我開始遇到的問題,無法讓 js 調用C#函數
// CefSharp 預設的 RegisterJsObject(沒有 camelCaseJavascriptNames 參數),隻認小寫字母開始的屬性、方法名稱。
// 使用帶 camelCaseJavascriptNames 參數的 RegisterJsObject,傳入 false,就能識别大寫字母開始的屬性、方法名稱了。
public class CallbackObjectForJs
{
public string name = "";
public void showTest(string msg)
{
MessageBox.Show(msg);
}
}
js
JsObj.name = "name";
JsObj.showTest("test");
C#調用 js
方式1. ExecuteScriptAsync 方法使用方式與 js 的 eval方法一樣,異步執行,無傳回值。
// xxx為js的方法名稱
mychrome.GetBrowser().MainFrame.ExecuteScriptAsync("xxx()");
// 為 js 的 變量jsVar指派 'abc'
mychrome.GetBrowser().MainFrame.ExecuteScriptAsync("jsVar='abc'");
注:好像是 ExecuteJavaScriptAsync 這個方法
方式2. EvaluateScriptAsync 方法使用方式與 js 的 eval方法一樣,異步執行,有傳回值。
Task<CefSharp.JavascriptResponse> t =
mychrome.GetBrowser().MainFrame.EvaluateScriptAsync("callTest2()");
// 等待js 方法執行完後,擷取傳回值
t.Wait();
// t.Result 是 CefSharp.JavascriptResponse 對象
// t.Result.Result 是一個 object 對象,來自js的 callTest2() 方法的傳回值
if(t.Result.Result != null)
{
MessageBox.Show(t.Result.Result.ToString());
}