如何将HTML内容与其在WPF中包含的WebBrowser控件一起扩展?

时间:2018-06-08 14:42:05

标签: html .net wpf xaml webbrowser-control

如果我缩放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内容。但我注意到我可以使用触摸手势或鼠标滚轮缩放WebBrowser内容。

解决此问题的最佳方法是什么?我可以想到几种途径来探索。

  1. 以某种方式获取WebBrowser内容以与控件一起扩展。
  2. 以编程方式缩放WebBrowser文档以匹配Viewbox缩放。
  3. 找到另一种在WPF中显示HTML内容的方法。
  4. 将HTML转换为XAML。
  5. Microsoft提出suggestion似乎与此问题有关,我尝试按照此回答中的说明在另一个问题上实施它:https://stackoverflow.com/a/40657760/2122672

    但这对我来说并没有多大意义。它似乎与禁用上下文菜单有关,而不是缩放HTML。

1 个答案:

答案 0 :(得分:0)

我使用了一种扩展方法,可以缩放,然后确保滚动条位于顶部。它需要一些不寻常的引用:用于缩放的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());
        }
    }