WPF WebBrowser управления масштабированием поддержки? - PullRequest
7 голосов
/ 17 июня 2011

Для элемента управления WPF WebBrowser есть способ дублировать функции масштабирования Internet Explorer?

Другими словами, в Internet Explorer есть меню View> Zoom> 75%, которое отображает веб-страницу в масштабе 75%. Есть ли способ заставить элемент управления веб-браузера, встроенный в приложение WPF, делать то же самое?

Я видел этот пост: WPF WebBrowser - Как увеличить содержимое?

Но кажется, что масштабируется только страница, а не содержимое страницы.

Ответы [ 4 ]

6 голосов
/ 19 мая 2015
public partial class TestWindow: UserControl
{
    public TestWindow()
    {
        InitializeComponent();

        browser.LoadCompleted += new LoadCompletedEventHandler(browser_LoadCompleted);
    }

    private void browser_LoadCompleted(object sender, NavigationEventArgs e)
    {
        try
        {

            FieldInfo webBrowserInfo = browser.GetType().GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);

            object comWebBrowser = null;
            object zoomPercent = 120;
            if (webBrowserInfo != null)
                comWebBrowser = webBrowserInfo.GetValue(browser);
            if (comWebBrowser != null)
            {
                InternetExplorer ie = (InternetExplorer)comWebBrowser;
                ie.ExecWB(SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref zoomPercent, IntPtr.Zero);
            }
        }
        catch (Exception ex)
        {
        }
    }


    public void SetBrowser(string url)
    {
        browser.Navigate(url,null,null,null);

    }

    internal void Destroy()
    {
        try
        {
            if (browser.Parent != null)
            {
                ((Grid)browser.Parent).Children.Remove(browser);
                browser.Navigate("about:blank");
                browser.Dispose();
                browser = null;
            }
        }
        catch { }

    }

}
4 голосов
/ 07 сентября 2011

Вот как я это сделал:

// Needed to expose the WebBrowser's underlying ActiveX control for zoom functionality
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
internal interface IServiceProvider
{
[return: MarshalAs(UnmanagedType.IUnknown)]
object QueryService(ref Guid guidService, ref Guid riid);
}
static readonly Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");

private void ZoomListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
object zoomPercent; // A VT_I4 percentage ranging from 10% to 1000%
switch(ZoomListBox.SelectedItem.ToString())
{
    case "System.Windows.Controls.ListBoxItem: 200%":
        zoomPercent = 200;
        break;
    case "System.Windows.Controls.ListBoxItem: 100%":
        zoomPercent = 100;
        break;
    case "System.Windows.Controls.ListBoxItem: 50%":
        zoomPercent = 50;
        break;
    default:
        zoomPercent = 100;
        break;
}

// grab a handle to the underlying ActiveX object
IServiceProvider serviceProvider = null;
if (m_webView.Document != null)
{
    serviceProvider = (IServiceProvider)m_webView.Document;
}
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
SHDocVw.IWebBrowser2 browserInst = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);

// send the zoom command to the ActiveX object
browserInst.ExecWB(SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref zoomPercent, IntPtr.Zero);
}

Все вещи поставщика услуг предоставляют ActiveX, так как элемент управления WPF WebBrowser не предоставляет его напрямую.Кроме того, это почти то же самое, что решение Алексея.

2 голосов
/ 18 июня 2011

Это не точный ответ, поскольку он предназначен для элемента управления WinForms, но, возможно, будет полезен в случае, если вы решите использовать его в WindowsFormsHost вместо элемента управления WPF, который предоставляет слишком мало, чтобы быть полезным.

Вы можете использовать команды OLE через ExecWB для экземпляра ActiveX: OLECMDID_ZOOM для размера текста и OLECMDID_OPTICAL_ZOOM для оптического увеличения. Например,

object pvaIn = 200; // A VT_I4 percentage ranging from 10% to 1000%
var browserInst = ((SHDocVw.IWebBrowser2)(browserContol.ActiveXInstance));
browserInst.ExecWB(SHDocVw.OLECMDID.OLECMDID_OPTICAL_ZOOM,
                   SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,
                   ref pvaIn, IntPtr.Zero);

Некоторые заметки:

  • ссылка на сборку Interop.SHDocVw необходима
  • команда успешно выполняется только после загрузки документа
  • диапазон pvaIn может быть получен через OLECMDID_GETZOOMRANGE
  • для справочного списка команд на MSDN
  • Я испытал это странное поведение, которое, казалось, происходило только на не 96 dpi. При запуске размер отображаемого текста не соответствовал тому, что сохранен в состоянии OLECMDID_ZOOM. Установка значения (в любое значение) не устранила несоответствия: отображаемый размер по-прежнему выглядит как [сохраненный размер + 2]. Когда оптическое увеличение было установлено на 100%, расхождение в размере текста исчезло (размер текста заметно уменьшился после увеличения до 100%). Этого не произошло в IE, и, возможно, это был просто странный артефакт в моей среде - но только к вашему сведению.
0 голосов
/ 08 апреля 2012

При использовании других решений я всегда получаю ошибки вида

HRESULT: 0x80040100
DRAGDROP_E_NOTR номенклатуре

Я нашел решение на этой странице, который работал для меня:

var wb = webBrowser.ActiveXInstance.GetType();

object o = zoomPercentage; // Between 10 and 1000.

wb.InvokeMember(
    @"ExecWB", 
    BindingFlags.InvokeMethod, 
    null, 
    webBrowser.ActiveXInstance, 
    new[]
        {
            OLECMDID.OLECMDID_OPTICAL_ZOOM, 
            OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, 
            o, 
            o
        }); 

с OLECMDID_OPTICAL_ZOOM, равным 63, и OLECMDEXECOPT_DONTPROMPTUSER, равным 2.

...