天天看點

wpf CefSharp 與 js互動

原文:

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());

}

繼續閱讀