C# WPF Webbrowser 强制所有网页链接在同一页面打开
只要搞懂Winform的 WPF稍微改一改就可以了

主类:负责跳转的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using static System.Windows.Forms.AxHost; namespace Test
{ public class WebBrowserUrl2
{
public String Url { get; } public String Frame { get; } public WebBrowserUrl2(String url, String frame)
{
this.Url = url;
this.Frame = frame;
}
}
public class WebBrowserEvent
{
public bool cancel;
} public class WebbrowserOnNewWindow
{
static readonly BindingFlags info =
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.FlattenHierarchy |
BindingFlags.CreateInstance; private WebBrowser web;
public WebbrowserOnNewWindow(WebBrowser webBrowser)
{
web = webBrowser ?? throw new Exception();
Excetue();
}
//跳转参考这个
public delegate void OnNewWindow(WebBrowserUrl2 webBrowserUrl, WebBrowserEvent webBrowserEvent); public event OnNewWindow BeforeNewWidnow; private void Excetue()
{ var propertyAxiWebbrowser = web.GetType().GetProperty("AxIWebBrowser2", info);
var axIWebBrowser2 = propertyAxiWebbrowser.GetValue(web, null);
var webBrowserEvent = new NewWebBrowserEvent(this);
var cookie = new ConnectionPointCookie(axIWebBrowser2, webBrowserEvent, typeof(INewDWWebBrowserEvent));
} public void OnBeforeNewWindow(string url, out bool cancel)
{
var Arg = BeforeNewWidnow;
WebBrowserUrl2 webBrowserUrl = new WebBrowserUrl2(url, null);
WebBrowserEvent webBrowserEvent = new WebBrowserEvent();
Arg?.Invoke(webBrowserUrl, webBrowserEvent);
cancel = webBrowserEvent.cancel;
}
} public class NewWebBrowserEvent : System.Runtime.InteropServices.StandardOleMarshalObject, INewDWWebBrowserEvent
{
private WebbrowserOnNewWindow web;
public NewWebBrowserEvent(WebbrowserOnNewWindow webbrowserOnNewWindow) => web = webbrowserOnNewWindow; public void BeforeNavigate2(object pDisp, ref object urlObject, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
{
//WPF这个和Winform差不多 没写
//webBrowser.OnBeforeNavigate((string)urlObject, (string)targetFrameName, out cancel);
}
//官方说明此 事件是低于IE6时会引发
public void NewWindow2(ref object ppDisp, ref bool cancel)
{
//WPF这个和Winform差不多 没写
// webBrowser.OnBeforeNewWindow(((WebBrowser)ppDisp).Url.ToString(), out cancel);
}
//当高于IE6时使用
public void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL)
{
web.OnBeforeNewWindow((string)URL, out cancel);
}
} [System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"),
System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIDispatch),
System.Runtime.InteropServices.TypeLibType(System.Runtime.InteropServices.TypeLibTypeFlags.FHidden)]
public interface INewDWWebBrowserEvent
{
[System.Runtime.InteropServices.DispId()]
void BeforeNavigate2(object pDisp, ref object urlObject, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel);
//官方说明此 事件是低于IE6时会引发
[System.Runtime.InteropServices.DispId()]
void NewWindow2(ref object ppDisp, ref bool cancel);
//当高于IE6时使用
[System.Runtime.InteropServices.DispId()]
void NewWindow3(object pDisp, ref bool cancel, ref object flags, ref object URLContext, ref object URL);
}
}
XAML 界面
//省略其他 <Grid>
<WebBrowser x:Name="WB" HorizontalAlignment="Left" Height="" Margin="10,10,0,0" VerticalAlignment="Top" Width="" Source="http://www.baidu.com" LoadCompleted="WB_LoadCompleted" />
</Grid>
XAML.CS
public partial class MainWindow : Window
{
private bool Start;
public MainWindow()
{
InitializeComponent(); }
private void WB_LoadCompleted(object sender, NavigationEventArgs e)
{
if (!Start)
{ //这一步是没法省了
//webbrowser在WPF中时密封类型
WebbrowserOnNewWindow onNewWindow = new WebbrowserOnNewWindow(WB);
onNewWindow.BeforeNewWidnow += OnNewWindow_BeforeNewWidnow;
Start = true;
}
}
private void OnNewWindow_BeforeNewWidnow(WebBrowserUrl2 webBrowserUrl, WebBrowserEvent webBrowserEvent)
{
WB.Navigate(new Uri(webBrowserUrl.Url));
webBrowserEvent.cancel = true;
} }
C# WPF Webbrowser 强制所有网页链接在同一页面打开的更多相关文章
- C# WinForm Webbrowser 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口(续)
上面那个文写的如同粑粑一样 效果图 Winfrom 中添加这个类就好了 using System; using System.Collections.Generic; using System.Com ...
- 强制所有网页链接在同一页面打开或者在TabControl中弹出新窗口
IEwebbrowser中老生常谈的话题. 一般的解决都是通过 // webBrowser.Navigating += WebBrowser_Navigating; 注册转跳前事件 private v ...
- WPF WebBrowser Memory Leak 问题及临时解决方法
首先介绍一下内存泄漏(Memory Leak)的概念,内存泄露是指程序中已动态分配的堆内存由于某种原因未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 最近在使用W ...
- .NET4.5 WFP中用WebBrowser获取/操作网页html代码
引言 想给自己之前写的网页小说爬虫程序更新换代,之前一直是用winform的形式写的程序,因此这一次更新打算把UI换成WPF(因为听说WPF很漂亮),顺便也以此引入WPF的学习. 那么作为网页爬虫程序 ...
- c# webbrowser 随机点击链接
HtmlElementCollection hec = webBrowser1.Document.All; ; i < hec.Count; i++) { if (hec[i].GetAttri ...
- WPF WebBrowser+TabControl MVVM模式 简单应用 提供源码下载
源代码下载 这个程序是TabControl和Webbrowser的练手小程序 可达到练手目的有: MVVM设计模式的基本使用 Binding(包括相对源[RelativeSource]绑定)的基本使用 ...
- paip.点击每个网页链接都提示下载的解决。
paip.点击每个网页链接都提示下载的解决. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn. ...
- WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()
WPF WebBrowser屏蔽弹出alert ,confirm ,prompt ,showModalDialog() ,window.open()添加Microsoft.mshtml.dll,然后写 ...
- JavaScript 网页链接调用Android程序
如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏 ...
随机推荐
- 微信小程序之如何使用iconfont
如何在小程序中使用iconfont 1.添加入库 2.加入项目 3.下载ttf 4.进行base64处理,在这个平台https://transfonter.org/ 上转换一下格式为base64位. ...
- 怎么样使用yum来安装mysql
linux下使用yum安装mysql,以及启动.登录和远程访问. 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没 ...
- 用cascade删除有约束的表或记录
删除有约束的表 Drop table TERMPRO_RULE_ROUTE_TYPE cascade constraints:
- VMware虚拟机安装Centos7详细步骤过程(图文)[转载]
Centos7官网下载地址:https://www.centos.org/download/ 图文安装步骤转载地址: https://www.jianshu.com/p/ce08cdbc4ddb?ut ...
- 手把手教你如何优化linux服务器
关闭不需要的服务.列出需要启动的的服务crond.network.sshd.irqbalance.syslog 启用 irqbalance 服务既可以提升性能,又可以降低能耗. syslog 是 li ...
- ffmpeg相关时间概念
v_rescale_q用于计算Packet的PTS.av_rescale_q的返回值是一个很大的整数,且每次计算的结果间隔很大. 不同于avcodec_encode_video改变AVCodecCon ...
- ffmpeg截取一段视频中一段视频
ffmpeg -i ./plutopr.mp4 -vcodec copy -acodec copy -ss 00:00:10 -to 00:00:15 ./cutout1.mp4 -y -ss ti ...
- ActiveX每次网页打开提示活动内容运行
(2) 设置允许活动内容运行. 在启动调试,网页经常会呈现如下提示框,每次都要确认,很麻烦. 以下方法可以消除这个提示框. 在IE中打开Internet 选项对话框,选择高级选项卡,勾选里 ...
- MYSQL中str_to_date函数的用法
str_to_date(str,format) 函数的用法 str_to_date函数将str转化为日期型的数据,format表示转化后的格式. format参数格式: 常用: %Y 年 %m 月 ...
- Java多线程-新特征-原子量
所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的. 为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题.在Java5之前,可以通过volatile.synch ...