WPF WebBrowser 弹出子页面

首先说一下WebBrowser控件的实现原理,微软的浏览器引擎使用的就是组件对象模型(COM)的软件接口架构,供其它支持的组件对象模型开发环境的应用程序存取及编辑网页,WebBrowser就是使用COM技术实现了相关接口,进而实现对网页的相关操作的。

WebBrowser 对网页的基本操作方法,大家可以去网上搜一下,我是第一次用,在这里只说一下我在使用过程中的一些总结

功能描述:我要实现的是在WebBrowser展示一个页面,同时这个页面中的<a> 标签,点击弹出一个小页面(一个列表)选择一个值,返回并修改父页面中<a>元素的文本信息

主页面 MainWindow 中 WebBrowser 的 Name 是 wbBrowser

页面内容

<a id="ta" href="" οnclick="window.open('child.html','','height=200,width=400,status=no,toolbar=no,menubar=no,location=no')">[名字]</a>

后台代码如下,首先在主页面加载时,关闭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"));

           //获取<a> 标签的id,不知道为什么getAttribute("id") 为什么不行,所以就自己写了一个根据Html截取了id的方法
            string id = GetId(wbBrowser.Document.ActiveElement.InnerHtml);
            SubSelectView selectView = new SubSelectView(id, url);
            selectView.TransfEvent += SelectView_TransfEvent;
            selectView.Show();
        }

        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页面内容

    <select id="sa" size=4 οndblclick="window.external.ReturnTest(document.getElementById('sa').value)">
        <option value="volvo">Volvo</option>
        <option value="saab">Saab</option>
        <option value="opel">Opel</option>
        <option value="audi">Audi</option>
    </select>

后台代码如下

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上了,试了下不行才改的

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值