webView.ZoomFactor 是畫面縮放率,不過每次變換網址,縮放率會重設,若要記錄下來,則要用一些技巧。
底下的方法是在每次調整縮放率時,會觸發 ZoomFactorChanged 事件,因此只要一觸發,就記錄縮放率為 zoom。
然後每次新的網址載入完成,就設定新的縮放率為 zoom 即可。
不過在實測中有個問題,就是每次更新網址時,新網址一出來就會重設縮放率,此時也會觸發 ZoomFactorChanged ,這時縮放率又回到 1,如此一來,新的網頁完成後,縮放率又會設為 1,等於沒作用。
所以在觀察各種網頁載入過程所觸發的事件,發現可以在 NavigationStarting 發生時,設定變數 SetWebViewZoom 為 false。當網頁一開始載入後,縮放率重設,觸發 ZoomFactorChanged ,但在 ZoomFactorChanged 中,會檢查 SetWebViewZoom 若為 false 就不記錄縮放率,因此就不會記錄重設縮放率為 1 的階段。
等到 SourceChanged 觸發,就設定新的縮放率,此時新頁就會縮放至先前的設定了。
再等到 NavigationCompleted 觸發時,再將 SetWebViewZoom 設為 true,之後只要再調整縮放率,又會再次記錄在 zoom 中了。
有些程式會建議在 NavigationCompleted 再設定縮放率,不過此時設定好像畫面會先重置再重設,因此在 SourceChanged 先設定會比較好。
程式如下:
bool SetWebViewZoom = false; // 是否設定 WebView 縮放率
webView = new WebView2();
webView.NavigationStarting += WebView_NavigationStarting;
webView.SourceChanged += WebView_SourceChanged;
webView.NavigationCompleted += webView_CoreWebView2NavigationCompleted;
webView.ZoomFactorChanged += WebView_ZoomFactorChanged;
private void WebView_NavigationStarting(object sender, CoreWebView2NavigationStartingEventArgs e)
{
SetWebViewZoom = false;
}
private void WebView_SourceChanged(object sender, CoreWebView2SourceChangedEventArgs e)
{
// 設定 webView2 縮放率
webView.ZoomFactor = zoom / 100.0;
}
private void webView_CoreWebView2NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
{
SetWebViewZoom = true;
}
private void WebView_ZoomFactorChanged(object sender, EventArgs e)
{
if (SetWebViewZoom) {
zoom = (int)(webView.ZoomFactor * 100.0);
}
}
底下簡單描述流程:
-
使用者將畫面縮小至 0.75
此時觸發 ZoomFactorChanged,
記錄最新的縮放率,設定 zoom = 75 (0.75 * 100 = 75)
-
使用者開啟新頁
此時觸發 NavigationStarting
將變數 SetWebViewZoom 設為 false
接著新頁縮放重置為 1,觸發 ZoomFactorChanged
但因為 SetWebViewZoom 為 false
所以不會記錄 zoom = 100
zoom 依然是 75
接著觸發 SourceChanged
設定縮放率,webView.ZoomFactor 設為 0.75
再觸發 CoreWebView2NavigationCompleted
將變數 SetWebViewZoom 設為 true
之後若再縮放畫面,又可以記錄在 zoom 變數中了。
之後看到的新頁面依然是縮放率為 0.75 的畫面了。
- 瀏覽次數:577
發表新回應