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

时间:2011-06-17 03:37:42

标签: wpf webbrowser-control zoom

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

换句话说,Internet Explorer具有菜单View>缩放> 75%,使网页的比例达到75%。有没有办法让嵌入在WPF应用程序中的Web浏览器控件执行相同的操作?

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

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

4 个答案:

答案 0 :(得分:6)

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 { }

    }

}

答案 1 :(得分:4)

我是这样做的:

// 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控件不直接公开它。除此之外,它与alexei的解决方案几乎相同。

答案 2 :(得分:2)

这不是一个确切的答案,因为它适用于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。

答案 3 :(得分:0)

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

  

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。