WebView2控件應用詳解系列博客
.NET混合開發解決方案2 WebView2與Edge瀏覽器的區別
.NET混合開發解決方案5 WebView2運行時與分發應用
.NET混合開發解決方案7 WinForm程序中通過NuGet管理器引用集成WebView2控件
.NET混合開發解決方案8 WinForm程序中通過設置固定版本運行時的BrowserExecutableFolder屬性集成WebView2控件
在前一篇博客《.NET混合開發解決方案11 網頁JS調用C#方法》中介紹了JS訪問C#方法的簡單實現方式。但是在企業級應用軟件中業務需求可能更加複雜,如JS調用C#方法之後,需要訪問宿主的窗體,設置窗體(WinForm、WPF、WinUI、Win32)中的控件等。
下面通過一個Demo來講解如何實現JS調用C#方法。
業務場景:JS調用C#方法,傳遞三個參數,分別是num1、num2、message。C#接收到參數後,調用WinFrom窗體中定義的方法,將num1與num2作爲參數傳入,並將計算結果顯示在窗體控件上。
先看一下示例效果
下面詳細介紹其實現步驟。
1、在Frm4JSCallWinForm窗體上添加一個label,用於顯示計算結果,默認值爲0,且顏色爲黑色。
2、Frm4JSCallWinForm窗體後臺代碼中添加如下邏輯方法
在主機對象中定義 TestCallCSharpWinForm() 方法,該方法中訪問 Frm4JSCallWinForm 窗體中的 SetResultFromWeb() 方法
在普通的類中如訪問一個窗體有兩種方式
第一種是使用窗體類來實例化一個對象
Frm4JSCallWinForm form = new Frm4JSCallWinForm();
第二種方式直接使用窗體已經實例化之後的對象。
窗體已經運行,說明已經實例化了,如果採用第一種方式,那麼新創建的對象與正在運行的窗體對象不是同一個對象,即使訪問到窗體中定義的方法也無法更新當前窗體上的控件屬性。所以必須採用第二種方式。
CustomWebView2HostObject 類 與 窗體 Frm4JSCallWinForm 類是兩個獨立的類,CustomWebView2HostObject 類無法直接獲取當前正在運行的Frm4JSCallWinForm 對象,我們知道一個類中的靜態變量或屬性可以通過類名稱直接訪問,這裏通過一個巧妙的方式來實現,即在 Frm4JSCallWinForm窗體中定義一個公開的靜態的 Frm4JSCallWinForm 對象,在構造函數中賦值爲當前運行的對象值。
此時在外部任何類中都可以通過 Frm4JSCallWinForm.Instance 訪問到當前運行的窗體對象。
在訪問目標網頁之前,通過webView2.CoreWebView2.AddHostObjectToScript()方法向網頁中注入主機對象,其中第一個參數是自定義名稱(隨意命名),JS中訪問主機對象時就需要與該參數名稱一致。
網頁中定義一個測試按鈕,並設置點擊事件
點擊事件中,第43行獲取主機對象,customWebView2HostObject 與 C#中定義的名稱需要完全相同。
使用主機對象調用C#方法,由於調用過程是異步的,所以需要使用 await,方法定義前需要加上 async。
以上四步完成後即實現了JS訪問窗體方法。