WebView2 for wpf控件非常好用,然而,由于它是用的HwndHost的方式嵌入到WPF程序中的,和傳統的使用HwndHost嵌入WinForm組件的方式一樣,它有著WPF由來已久的空域問題(Airspace issuse),簡單來說就是這樣一個現象:
-
通過HwndHost的組件必須是z-index的頂層, 也就是說,不能在它的上面疊加其它組件。
-
組件不支持透明效果,不支持二三維變換等高級特性。
如果是以標準的矩形框的方式嵌入瀏覽器,且沒有想在瀏覽器界面上疊加其它組件的需求,這個限制大部分的時候對我們沒有啥其它的影響。 但它也限制了我們使用WPF中的高級組件的特效。
解決方案
要解決這個問題,常規的方式是離屏渲染,將瀏覽器頁面在后端渲染到Bitmap中,再將Bitmap繪制到WPF組件中展現,同時還要處理鼠標等事件。像CEFSharp for wpf就是采用這種方式。并且最近看到的DotNetBrowser也支持這種方案。
這種方案主要的問題是性能問題,之前用CEF Sharp試過,性能基本上下降了一個數量級,在復雜場景(如在有大量標繪的地圖上)對比WinForm的版本上有明顯卡頓。并且矢量動畫有比較明顯的掉幀。不知道新版本或DotNetBrowser有沒有改善。
WinUI
另外一個方案是使用WinUI,WinUI有著類似WPF的功能,但由于它采用了不同的渲染和集成機制,論壇上說WinUI沒有這個問題,由于我不怎么用WinUI,沒有試過。
官方方案
即使是離屏渲染這種低效的方案,目前WebView2也并不支持,官方雖然有issue在跟蹤,但官方給出的時間計劃也是一拖再拖,2年過去了也沒有解決方案。雖然論壇上人們對官方的解決方案比較悲觀,但這里記錄下,下次需要用的時候再看看。
更新
2023.09.16:此問題目前有一個社區的方案,可以參看我的文章:WPF使用WebView2的空域問題的解決方案
浙公網安備 33010602011771號