0

我正在使用 .Net 4.0 WebBrowser(来自 System.Windows.Controls)。在我的应用程序中,用户可以修改 html 数据并且网络浏览器显示更新。然后应用程序应自动滚动到显示的上一个元素。

我在 Windows 7 上使用 WPF / c# 4.0。

详细地:

  • 在代码中我调用 WebBrowser.NavigateToString(htmlData1);
  • 用户滚动到任意位置
  • 用户更改(以某种方式)html文档
  • 现在我想找到(并记住)显示的第一个 html 元素
  • 我打电话给 WebBrowser.NavigateToString(htmlData2);
  • 现在我想使用记忆的元素来自动滚动html文档(我知道有 IHTMLElement.scrollIntoView() 可以做到这一点)

所以问题是:如何在 WebBrowser 中获取第一个可见的 html 元素?

您可能会说更新后的 html 将不再具有记忆的元素。正确的。但我在文档中有时间戳,并将使用记忆的 html 元素在新的 html 文档中找到最佳位置。

4

1 回答 1

0

我想我找到了正确的使用方法。当文档被刷新时,实际上有两种可能保留滚动位置。

假设有以下成员:

WebBrowser _browser;
HTMLDocument HtmlDoc { get { return (HTMLDocument)_browser.Document; } }

(1) 如果文档没有真正改变(在我的例子中只是改变了样式),我使用当前滚动位置在更新后自动滚动:

  • 刷新前:

    _scrollPos = ((IHTMLElement2)(HtmlDoc.documentElement)).scrollTop;
    
  • 刷新后:

    HtmlDoc.parentWindow.scrollTo(0, _scrollPos);
    

(2) 如果文档发生变化,我使用文档的左上角元素(即已知结构)

  • 刷新前:

    IHTMLElement el = HtmlDoc.elementFromPoint(50, 0);
    

    使用该 el 做一些魔术(需要了解文档)并记住一些可用于在更新后搜索最佳元素的字符串。

    string beforeRefresh = fromElement(el);
    
  • 刷新后使用记住的字符串并在重新加载的 html 文档中搜索最佳 html 元素。

    IHTMLElement newEl = fromString(beforeRefresh);
    newEl.scrollIntoView(true);
    

所以我缺少的实际方法是 elementFromPoint()。其余的是“自定义逻辑”。

于 2013-07-21T18:50:16.593 回答