首页 文章

WPF WebBrowser控制放大/缩小支持?

提问于
浏览
7

对于WPF WebBrowser控件,有没有办法复制Internet Explorer的缩放功能?

换句话说,Internet Explorer的菜单视图>缩放> 75%,使网页的比例为75% . 有没有办法让一个嵌入在WPF应用程序中的Web浏览器控件做同样的事情?

我看过这篇文章:WPF WebBrowser - How to Zoom Content?

但它似乎只是缩放页面而不是页面内容 .

4 回答

  • 0
    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 { }
    
        }
    
    }
    
  • 2

    我是这样做的:

    // 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);
    }
    

    由于WPF WebBrowser控件不直接公开ActiveX,因此所有服务提供程序都会公开ActiveX . 除此之外,它与alexei的解决方案几乎相同 .

  • 6

    这不是一个确切的答案,因为它适用于WinForms控件,但如果您决定在WindowsFormsHost而不是WPF控件中使用它,这可能会很有用,因为它暴露的方式太少而无法使用 .

    您可以在ActiveX实例上通过ExecWB使用OLE命令: 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程序集

    • 该命令仅在文档加载后成功

    • 可以通过 OLECMDID_GETZOOMRANGE 检索pvaIn的范围

    • 参考命令列表在MSDN

    • 我经历过这种奇怪的行为,似乎只发生在非96 dpi上 . 启动时,呈现的文本大小与OLECMDID_ZOOM状态中存储的大小不对应 . 设置值(到任何值)并没有解决差异:渲染的大小仍然是[存储的大小2] . 当光学变焦设置为100%时,文本大小的差异消失(文本大小在缩放到100%后明显缩小) . 这在IE中并没有发生,也许这只是我环境中一个奇怪的神器 - 但只是fyi .

  • 4

    当使用其他解决方案时,我总是会遇到错误

    HRESULT:0x80040100 DRAGDROP_E_NOTREGISTERED

    我在this page找到了一个适合我的解决方案:

    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 .

相关问题