Переменные WPF C # HTMLDocument автоматически обновляются - PullRequest
0 голосов
/ 29 ноября 2018

Поэтому я пытаюсь сравнить два 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, похоже, он меняется сам по себе.Я уже несколько дней сижу над этой проблемой, надеюсь, кто-нибудь мне поможет.

1 Ответ

0 голосов
/ 29 ноября 2018

Form.RosterBrowser.Document возвращает ссылку в браузер Document, поэтому lastDoc и thisDoc - это две ссылки, указывающие на один и тот же объект 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, чтобы избежать дублирования выражения поиска текста.

...