User Tools

Site Tools


study:cs-webbrowser:20250613-002:index

記錄 WebView2 的縮放率 (2025-06-13)

Local Backup

  • 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 的畫面了。

study/cs-webbrowser/20250613-002/index.txt · Last modified: 2025/06/13 09:14 by jethro