代码之家  ›  专栏  ›  技术社区  ›  Kyle Delaney

如何在wpf中使html内容与其包含的webbrowser控件一起缩放?

  •  0
  • Kyle Delaney  · 技术社区  · 8 年前

    如果我缩放WebBrowser控件(例如使用ViewBox),则其内容不会随之缩放。下面是一个示例:

    <Viewbox>
        <StackPanel Background="LightBlue">
            <Label Content="XAML xaml"/>
            <WebBrowser Source="C:\MyPath\Test.html" />
        </StackPanel>
    </Viewbox>
    

    HTML showing the same font size regardless of how big its WebBrowser control is

    我有一个wpf应用程序,可以加载和显示数百个本地html文件。但是,在3840x2160显示器上,html看起来非常小,因为我的viewbox无法像拉伸其他内容那样拉伸html内容。不过我注意到我可以用触摸手势或鼠标轮缩放网页浏览器内容。

    解决这个问题的最好办法是什么?我可以想出几个探索的途径。

    1. 以某种方式让webbrowser内容与控件一起缩放。
    2. 以编程方式缩放WebBrowser文档以匹配ViewBox缩放。
    3. 找到另一种在wpf中显示html内容的方法。
    4. 将html转换为xaml。

    微软 suggestion 这似乎与这个问题有关,我在另一个问题上尝试按照这个答案中的描述来实现它: https://stackoverflow.com/a/40657760/2122672

    但这对我来说没什么意义。与缩放html相比,它似乎更多地与禁用上下文菜单有关。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Kyle Delaney    7 年前

    我使用了一个扩展方法来缩放,然后确保滚动条位于顶部。它需要一些不寻常的引用:用于缩放的Microsoft Internet控件和用于滚动的Microsoft.mshtml。

    public static void SetZoom(this System.Windows.Controls.WebBrowser wb, int zoom)
    {
        try
        {
            FieldInfo webBrowserInfo = wb.GetType().GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
    
            object comWebBrowser = null;
            object zoomPercent = zoom;
    
            if (webBrowserInfo != null)
                comWebBrowser = webBrowserInfo.GetValue(wb);
            if (comWebBrowser != null)
            {
                InternetExplorer ie = (InternetExplorer)comWebBrowser;
                ie.ExecWB(OLECMDID.OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref zoomPercent, IntPtr.Zero);
    
                if (wb.Document is mshtml.HTMLDocument htmlDoc)
                {
                    htmlDoc.parentWindow.scrollTo(0, 0);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }