我有一个System.Windows.Controls.WebBrowser。它有一些html来自用户正在编辑的另一个文档。当html发生变化时,我想要做的就是更新WebBrowser的html,然后将WebBrowser滚动回原处。我成功缓存了滚动偏移(请参阅How to retrieve the scrollbar position of the webbrowser control in .NET)。但是当负载完成时我无法收到回调。这是我尝试过的:
// constructor
public HTMLReferenceEditor()
{
InitializeComponent();
WebBrowser browser = this.EditorBrowser;
browser.LoadCompleted += Browser_LoadCompleted;
//browser.Loaded += Browser_Loaded; // commented out as it doesn't fire when the html changes . . .
}
private void Browser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
CommonDebug.LogLine("LoadCompleted");
this.ScrollWebBrowser();
}
private void ScrollWebBrowser()
{
WebBrowser browser = this.EditorBrowser;
ReferenceHierarchicalViewModel rhvm = this.GetReferenceHierarchichalViewModel();
int? y = rhvm.LastKnownScrollTop; // this is the cached offset.
browser?.ScrollToY(y);
}
LoadCompleted
回调正在解雇。但滚动没有发生。我怀疑回调太快了。但是我的滚动方法也可能是错误的:
public static void ScrollToY(this WebBrowser browser, int? yQ)
{
if (yQ.HasValue)
{
object doc = browser?.Document;
HTMLDocument castDoc = doc as HTMLDocument;
IHTMLWindow2 window = castDoc?.parentWindow;
int y = yQ.Value;
window?.scrollTo(0, y);
CommonDebug.LogLine("scrolling", window, y);
// above is custom log method; prints out something like "scrolling HTMLWindow2Class3 54", which
// at least proves that nothing is null.
}
}
如何让浏览器滚动?顺便说一句,我没有看到其他人提到的一些回调方法,例如:这里提到的DocumentCompleted
对我来说不存在。 Detect WebBrowser complete page loading。换句话说,由于某些原因我不明白,我的WebBrowser与他们的不同。对我来说,这些方法并不存在。