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.Document
returns一个引用到浏览器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
来避免重复文本查找表达式。
所以我尝试比较两个 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.Document
returns一个引用到浏览器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
来避免重复文本查找表达式。