.NET混合開發解決方案12 網頁JS調用C#方法訪問WinForm或WPF窗體

WebView2控件應用詳解系列博客

.NET桌面程序集成Web網頁開發的十種解決方案 

.NET混合開發解決方案1 WebView2簡介

.NET混合開發解決方案2 WebView2與Edge瀏覽器的區別

.NET混合開發解決方案3 WebView2的進程模型

.NET混合開發解決方案4 WebView2的線程模型

.NET混合開發解決方案5 WebView2運行時與分發應用

.NET混合開發解決方案7 WinForm程序中通過NuGet管理器引用集成WebView2控件

.NET混合開發解決方案8 WinForm程序中通過設置固定版本運行時的BrowserExecutableFolder屬性集成WebView2控件

.NET混合開發解決方案9 WebView2控件的導航事件

.NET混合開發解決方案10 WebView2控件調用網頁JS方法

.NET混合開發解決方案11 網頁JS調用C#方法

  在前一篇博客《.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

1、在Frm4JSCallWinForm窗體上添加一個label,用於顯示計算結果,默認值爲0,且顏色爲黑色。

 2、Frm4JSCallWinForm窗體後臺代碼中添加如下邏輯方法

步驟2

在主機對象中定義 TestCallCSharpWinForm() 方法,該方法中訪問 Frm4JSCallWinForm 窗體中的 SetResultFromWeb() 方法

在普通的類中如訪問一個窗體有兩種方式

第一種是使用窗體類來實例化一個對象

Frm4JSCallWinForm form = new Frm4JSCallWinForm();

第二種方式直接使用窗體已經實例化之後的對象。

窗體已經運行,說明已經實例化了,如果採用第一種方式,那麼新創建的對象與正在運行的窗體對象不是同一個對象,即使訪問到窗體中定義的方法也無法更新當前窗體上的控件屬性。所以必須採用第二種方式。

CustomWebView2HostObject 類 與 窗體 Frm4JSCallWinForm 類是兩個獨立的類,CustomWebView2HostObject 類無法直接獲取當前正在運行的Frm4JSCallWinForm 對象,我們知道一個類中的靜態變量或屬性可以通過類名稱直接訪問,這裏通過一個巧妙的方式來實現,即在 Frm4JSCallWinForm窗體中定義一個公開的靜態的 Frm4JSCallWinForm  對象,在構造函數中賦值爲當前運行的對象值。

此時在外部任何類中都可以通過 Frm4JSCallWinForm.Instance 訪問到當前運行的窗體對象。

步驟3

在訪問目標網頁之前,通過webView2.CoreWebView2.AddHostObjectToScript()方法向網頁中注入主機對象,其中第一個參數是自定義名稱(隨意命名),JS中訪問主機對象時就需要與該參數名稱一致。

步驟4

網頁中定義一個測試按鈕,並設置點擊事件

點擊事件中,第43行獲取主機對象,customWebView2HostObject 與 C#中定義的名稱需要完全相同。

使用主機對象調用C#方法,由於調用過程是異步的,所以需要使用 await,方法定義前需要加上 async。

以上四步完成後即實現了JS訪問窗體方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章