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

2hh7jdfx  于 2023-06-07  发布在  其他
关注(0)|答案(4)|浏览(381)

对于WPF WebBrowser控件,是否有方法复制Internet Explorer的缩放功能?
换句话说,Internet Explorer有一个菜单View > Zoom > 75%,它可以以75%的比例呈现网页。有没有一种方法可以让嵌入在WPF应用程序中的Web浏览器控件做同样的事情?
我看过这篇文章:WPF WebBrowser - How to Zoom Content?
但它似乎只扩展了页面,而不是页面内容。

hk8txs48

hk8txs481#

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

    }

}
vwhgwdsa

vwhgwdsa2#

我是这样做的:

// 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控件不直接公开它。除此之外,它和阿列克谢的解决方案差不多。

yyhrrdl8

yyhrrdl83#

这不是一个确切的答案,因为它是针对WinForms控件的,但如果您决定在WindowsFormsHost中使用它而不是WPF控件,则可能会很有用,因为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程序集的引用
  • 该命令仅在加载文档后才成功
  • pvaIn范围可以通过OLECMDID_GETZOOMRANGE检索
  • 用于参考的命令列表位于MSDN
  • 我经历了这种奇怪的行为,似乎只发生在非96 dpi。启动时,呈现的文本大小与OLECMDID_ZOOM状态中存储的文本大小不对应。设置值(为任何值)并不能修复差异:呈现的大小仍然是看起来像[存储的大小+2]。当光学变焦设置为100%时,文本大小的差异消失了(文本大小在缩放到100%后明显缩小)。这在IE中没有发生,也许这只是我环境中的一个奇怪的工件--但仅供参考。
mtb9vblg

mtb9vblg4#

当使用其他的解决方案时,我总是得到错误的种类
HRESULT:0x80040100
DRAGDROP_E_未注册
我在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。

相关问题