onbeforenavigate2 打开一个html文件,使用WPF浏览器控件时,如何使用BeforeNavigate2?...

是。 WPF的WebBrowser控件真的是脑死亡。最重要的是它甚至是密封的。

您必须使用Windows.Forms的WebBrowser控件并将其嵌入WindowsFormsHost中。

另外,你必须从WebBrowser派生一个类并在其中做一些COM魔术。

像这样制作一个UserControl:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:DialogContentControls="clr-namespace:MP.Assistant.WpfClient.DialogContentControls"

mc:Ignorable="d"

d:DesignHeight="300"

d:DesignWidth="300">

然后像这样修改Windows.Forms WebBrowser:

using System.Runtime.CompilerServices;

using System.Runtime.InteropServices;

using System.Security.Permissions;

using System.Windows.Forms;

namespace MP.Assistant.WpfClient.DialogContentControls

{

/// Imports the BeforeNavigate2 method from the OLE DWebBrowserEvents2

/// interface.

[ComImport]

[Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D")]

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

[TypeLibType(TypeLibTypeFlags.FHidden)]

public interface DWebBrowserEvents2

{

[PreserveSig]

[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]

[DispId(250)]

void BeforeNavigate2([In] [MarshalAs(UnmanagedType.IDispatch)] object pDisp,

[In] [MarshalAs(UnmanagedType.Struct)] ref object URL,

[In] [MarshalAs(UnmanagedType.Struct)] ref object Flags,

[In] [MarshalAs(UnmanagedType.Struct)] ref object TargetFrameName,

[In] [MarshalAs(UnmanagedType.Struct)] ref object PostData,

[In] [MarshalAs(UnmanagedType.Struct)] ref object Headers,

[In] [Out] ref bool Cancel);

}

public class ExtendedWinFormsWebBrowser : WebBrowser

{

// Handles the NavigateError event from the underlying ActiveX

// control by raising the NavigateError event defined in this class.

AxHost.ConnectionPointCookie cookie;

ExtendedWinFormsWebBrowserEventHelper helper;

bool renavigating;

public ExtendedWinFormsWebBrowser()

{

AdditionalHeaders = new string[] {};

}

public string[] AdditionalHeaders { get; set; }

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]

protected override void CreateSink()

{

base.CreateSink();

// Create an instance of the client that will handle the event

// and associate it with the underlying ActiveX control.

helper = new ExtendedWinFormsWebBrowserEventHelper(this);

cookie = new AxHost.ConnectionPointCookie(ActiveXInstance, helper, typeof (DWebBrowserEvents2));

}

[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]

protected override void DetachSink()

{

// Disconnect the client that handles the event

// from the underlying ActiveX control.

if (cookie != null)

{

cookie.Disconnect();

cookie = null;

}

base.DetachSink();

}

void OnBeforeNavigate2(object pDisp,

ref object url,

ref object flags,

ref object targetFrameName,

ref object postData,

ref object headers,

ref bool cancel)

{

if (!renavigating)

{

if (AdditionalHeaders.Length > 0)

{

headers += string.Join("rn", AdditionalHeaders) + "rn";

renavigating = true;

cancel = true;

Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);

}

}

else

{

renavigating = false;

}

}

#region Nested type: ExtendedWinFormsWebBrowserEventHelper

class ExtendedWinFormsWebBrowserEventHelper : StandardOleMarshalObject, DWebBrowserEvents2

{

readonly ExtendedWinFormsWebBrowser parent;

public ExtendedWinFormsWebBrowserEventHelper(ExtendedWinFormsWebBrowser parent)

{

this.parent = parent;

}

#region DWebBrowserEvents2 Members

public void BeforeNavigate2(object pDisp,

ref object URL,

ref object Flags,

ref object TargetFrameName,

ref object PostData,

ref object Headers,

ref bool Cancel)

{

parent.OnBeforeNavigate2(pDisp,

ref URL,

ref Flags,

ref TargetFrameName,

ref PostData,

ref Headers,

ref Cancel);

}

#endregion

}

#endregion

}

}

然后从代码隐藏中使用WebBrowser(在XAML中命名为WebBrowser),并为AdditionalHeaders提供所需的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值