Как получить масштабируемый HTML-контент вместе с содержащим его элементом управления WebBrowser в WPF? - PullRequest
0 голосов
/ 08 июня 2018

Если я масштабирую элемент управления 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.Тем не менее, HTML выглядит очень маленьким на дисплее 3840x2160, потому что мой Viewbox не может растянуть содержимое HTML так же, как и все остальное.Однако я заметил, что могу масштабировать содержимое WebBrowser с помощью сенсорных жестов или колесика мыши.

Как лучше всего решить эту проблему?Я могу придумать несколько путей для изучения.

  1. Как-нибудь масштабировать содержимое WebBrowser с помощью элемента управления.
  2. Программно масштабировать документ WebBrowser в соответствии с масштабированием Viewbox.
  3. Найдите другой способ отображения содержимого HTML в WPF.
  4. Преобразование HTML в XAML.

Microsoft сделала предложение , которое, похоже, связано с этой проблемой.и я попытался реализовать это, как описано в этом ответе на другой вопрос: https://stackoverflow.com/a/40657760/2122672

Но это на самом деле не имеет смысла для меня.Кажется, это больше связано с отключением контекстного меню, чем с масштабированием HTML.

1 Ответ

0 голосов
/ 12 июня 2018

Я использовал метод расширения, который увеличивает масштаб, а затем проверяет, находится ли полоса прокрутки сверху.Требуются некоторые необычные ссылки: Microsoft Internet Controls для масштабирования и 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());
    }
}
...