wpf WebBrowser元素进入和离开事件停止工作

时间:2013-04-28 16:22:02

标签: wpf browser

我需要在html中突出显示一些span元素并显示一个弹出窗口。以下代码执行突出显示,但进入和离开事件在短暂使用后停止工作(可能20次进入和离开)。如果我添加弹出窗口,事件将会更快地停止工作 - 通常只需要拨打一两个电话。我不知道如何调试它,因为没有异常,事件就停止被调用。

我从文档中编写了这段代码,因为我找不到任何人使用像这样的元素事件处理程序:HTMLElementEvents2_onmouseenterEventHandler

请注意,此代码需要“使用mshtml;”以及对COM'Microsoft HTML对象库'

的引用
 void mBrowser_LoadCompleted(object sender, EventArgs e)
    {
        Debug.WriteLine("LoadCompleted");
        var doc = (IHTMLDocument2)mBrowser.Document;            
        foreach (IHTMLElement elem in doc.all)
        {
            if (elem.tagName == "SPAN")
            {
                mshtml.HTMLElementEvents2_Event iEvt;
                iEvt = (HTMLElementEvents2_Event)elem;
                iEvt.onmouseenter += new HTMLElementEvents2_onmouseenterEventHandler(onMouseEnter);
                iEvt.onmouseleave += new HTMLElementEvents2_onmouseleaveEventHandler(onMouseLeave);
                //iEvt.onmouseover  += new HTMLElementEvents2_onmouseoverEventHandler(onMouseOver);
                Debug.WriteLine("span: " + elem.innerHTML);
            }
        }
    }

    void onMouseEnter(mshtml.IHTMLEventObj e)
    {

        Debug.WriteLine(" mouse enter! " + e.srcElement.innerHTML);
        //mPopup.IsOpen = true;
        //mPopup.HorizontalOffset = e.x;
        //mPopup.VerticalOffset = e.y;
        e.srcElement.style.backgroundColor = "#CCCCCC";

    }
    void onMouseLeave(mshtml.IHTMLEventObj e)
    {
        //mPopup.IsOpen = false;
        Debug.WriteLine(" mouse leave! " + e.srcElement.innerHTML);
        e.srcElement.style.backgroundColor = "#FFFFFF";
    }

2 个答案:

答案 0 :(得分:1)

您需要将元素事件保留在静态字段上以避免垃圾回收。

static mshtml.HTMLElementEvents2_Event iEvt;

答案 1 :(得分:0)

您需要保留元素事件列表以避免垃圾回收。

List<mshtml.HTMLElementEvents2_Event> mEvts = new List<HTMLElementEvents2_Event>();

mEvts.Add(iEvt);