WPF C# HTMLDocument变量自动更新

WPF C# HTMLDocument variables automatically updates

所以我尝试比较两个 HTMLDocuments 以查看网站是否有使用 DispatchTimer() 的任何更改。

这是我的代码:

    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,它似乎会自行更改。我已经在这个问题上坐了一天了,希望有人能帮助我。

Form.RosterBrowser.Documentreturns一个引用到浏览器Document,所以lastDocthisDoc是两个指向位于内存堆某处的同一 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();
}

我使用了 属性 GroupListText 来避免重复文本查找表达式。