WPF使用WebView2的空域問題(Airspace issuse)

WebView2 for wpf控件非常好用,然而,由於它是用的HwndHost的方式嵌入到WPF程序中的,和傳統的使用HwndHost嵌入WinForm組件的方式一樣,它有着WPF由來已久的空域問題(Airspace issuse),簡單來說就是這樣一個現象:

  1. 通過HwndHost的組件必須是z-index的頂層, 也就是說,不能在它的上面疊加其它組件。
  2. 組件不支持透明效果,不支持二三維變換等高級特性。

如果是以標準的矩形框的方式嵌入瀏覽器,且沒有想在瀏覽器界面上疊加其它組件的需求,這個限制大部分的時候對我們沒有啥其它的影響。 但它也限制了我們使用WPF中的高級組件的特效。

解決方案

要解決這個問題,常規的方式是離屏渲染,將瀏覽器頁面在後端渲染到Bitmap中,再將Bitmap繪製到WPF組件中展現,同時還要處理鼠標等事件。像CEFSharp for wpf就是採用這種方式。並且最近看到的DotNetBrowser也支持這種方案。

這種方案主要的問題是性能問題,之前用CEF Sharp試過,性能基本上下降了一個數量級,在複雜場景(如在有大量標繪的地圖上)對比WinForm的版本上有明顯卡頓。並且矢量動畫有比較明顯的掉幀。不知道新版本或DotNetBrowser有沒有改善。

WinUI

另外一個方案是使用WinUI,WinUI有着類似WPF的功能,但由於它採用了不同的渲染和集成機制,論壇上說WinUI沒有這個問題,由於我不怎麼用WinUI,沒有試過。

官方方案

即使是離屏渲染這種低效的方案,目前WebView2也並不支持,官方雖然有issue在跟蹤,但官方給出的時間計劃也是一拖再拖,2年過去了也沒有解決方案。雖然論壇上人們對官方的解決方案比較悲觀,但這裏記錄下,下次需要用的時候再看看。

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