首先说一下WebBrowser控件的实现原理,微软的浏览器引擎使用的就是组件对象模型(COM)的软件接口架构,供其它支持的组件对象模型开发环境的应用程序存取及编辑网页,WebBrowser就是使用COM技术实现了相关接口,进而实现对网页的相关操作的。
WebBrowser 对网页的基本操作方法,大家可以去网上搜一下,我是第一次用,在这里只说一下我在使用过程中的一些总结
功能描述:我要实现的是在WebBrowser展示一个页面,同时这个页面中的 标签,点击弹出一个小页面(一个列表)选择一个值,返回并修改父页面中元素的文本信息
主页面 MainWindow 中 WebBrowser 的 Name 是 wbBrowser
页面内容
后台代码如下,首先在主页面加载时,关闭WebBrowser的NewWindow事件
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
wbBrowser.Url = new Uri("网页路径");
wbBrowser.NewWindow += wbBrowser_NewWindow;
}
private void wbBrowser_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
//获取子页面本地路径
string url = "file:///{0}child.html";
url = string.Format(url, AppDomain.CurrentDomain.BaseDirectory.Replace("\\", "/").Replace(" ", "%20"));
public string GetId(string htmlStr)
{
string s = htmlStr.Substring(htmlStr.IndexOf(" id=") + 4);
return s.Substring(0, s.IndexOf(" "));
}
//子页面返回值的处理事件
private void SelectView_TransfEvent(string id, string value)
{
wbBrowser.Document.GetElementById(id).SetAttribute("InnerText", value);
}
子页面 SubSelectView 中 WebBrowser 的 Name 是 wb
child.html页面内容
后台代码如下
public partial class SubSelectView : Window
{
//声明委托和事件
public delegate void TransfDelegate(String id, String value);
public event TransfDelegate TransfEvent;
private string id;
private string url;
public SubSelectView(string _id, string _url)
{
InitializeComponent();
id = _id;
url = _url;
this.Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
//js的可访问对象指定为OprateBasic
wb.ObjectForScripting = new OprateBasic(this);
wb.Url = new Uri(url);
}
//触发返回值事件,并关闭该WPF页面
public void Rtest(string str)
{
TransfEvent(id, str);
this.Close();
}
}
//自定义一个类,增加Com特性,js即可以访问其中的方法
[System.Runtime.InteropServices.ComVisible(true)]
public class OprateBasic
{
private SubSelectView instance;
//构造函数中,获取WPF页面对象
public OprateBasic(SubSelectView instance)
{
this.instance = instance;
}
public void ReturnTest(string p)
{
instance.Rtest(p);
}
}
总结
1. wbBrowser 显示页面可以通过 wbBrowser.Url = new Uri() 或者 wbBrowser.Document.Body.InnerHtml = 的方式实现
2. 通过 wbBrowser.NewWindow 事件可以关闭HTML弹出页面等操作
3. wbBrowser.Document.ActiveElement.SetAttribute() 方法,值是改了,但是页面不会刷新,
加一个MessageBox.Show()才可以
4. 通过自定义类( [System.Runtime.InteropServices.ComVisible(true)])可以实现 js 与C# 后台代码的通讯
一开始把 [System.Runtime.InteropServices.ComVisible(true)] 直接放在SubSelectView上了,试了下不行才改的