WPF WebBrowser 弹出子页面

首先说一下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"));

           //获取 标签的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页面内容

   

后台代码如下

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

 

 

你可能感兴趣的:(WPF WebBrowser 弹出子页面)