WPF C#HTMLDocument变量会自动更新

时间:2018-11-28 22:06:55

标签: c# wpf wpf-controls mshtml

因此,我尝试使用DispatchTimer()比较两个HTMLDocument,以查看网站中是否有任何更改。

这是我的代码:

    HTMLDocument lastDoc;

    public void startTimer()
    {
        lastDoc = (HTMLDocument)Form.RosterBrowser.Document;

        DispatcherTimer dispatcherTimer = new DispatcherTimer();
        dispatcherTimer.Tick += dispatcherTimer_Tick;
        dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
        dispatcherTimer.Start();
    }
    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        var thisDoc = (HTMLDocument)Form.RosterBrowser.Document;
        LogTextBlockControl.Text += "DOCUMENT THIS: " + thisDoc.getElementById("groupList").innerText.Length.ToString();
        LogTextBlockControl.Text += "DOCUMENT LAST: " + lastDoc.getElementById("groupList").innerText.Length.ToString();
    }

如您所见:当时间第一次开始时,我得到HTMLDocument并将其存储在lastDoc中。然后,每2秒,我得到另一个HTMLDocument变量,并将其存储在thisDoc中。现在,我每2秒打印一次特定元素的长度,以查看该元素内部是否有任何更改。

当程序第一次启动时,由于它们都具有相同的HTMLDocument,因此它们都将打印相同的数字,这是正常的。但是可以说我在groupList元素中做了一些更改。您可能会认为thisDoc变量的长度会改变。可以,但是lastDoc的长度也可以。这就是问题所在。

每当元素更改时,thisDoc都会更新并打印更改后的元素的长度,但lastDoc也将更新并开始打印相同的长度。这不是我想要的,因为现在我无法比较两者来触发功能。我在整个程序中只调用一次startTimer(),并且我从不更改lastDoc,它似乎在改变自己。我已经在这个问题上待了一天,希望有人能帮助我。

1 个答案:

答案 0 :(得分:0)

Form.RosterBrowser.Document返回浏览器Document引用,因此lastDocthisDoc是指向相同{{1}的两个引用}位于内存堆中某处的对象。

相反,您应该存储要监视的值。
您最好监视文本本身,不仅要监视文本的长度(因为可以更改文本),还要保持相同的长度。

HTMLDocument

我使用属性string lastText; private string GroupListText => ((HTMLDocument)Form.RosterBrowser.Document).getElementById("groupList").innerText; public void startTimer() { lastText = GroupListText; DispatcherTimer dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += dispatcherTimer_Tick; dispatcherTimer.Interval = new TimeSpan(0, 0, 2); dispatcherTimer.Start(); } private void dispatcherTimer_Tick(object sender, EventArgs e) { var thisText = GroupListText; LogTextBlockControl.Text += "DOCUMENT THIS: " + thisText.Length.ToString(); LogTextBlockControl.Text += "DOCUMENT LAST: " + lastText.Length.ToString(); } 来避免重复文本查找表达式。