2009-09-18 68 views
8

我們在Winforms應用程序中有一個Web瀏覽器,可以很好地顯示xslt呈現的所選項目的歷史記錄。C#在WebBrowser控件中導航到錨點

xslt在輸出的html中寫出<a>標記,以允許webBrowser控件導航到選定的歷史記錄條目。

因爲我們不是在嚴格的web意義上導航到html,而是通過DocumentText設置html,所以我無法使用#AnchorName'導航'到所需的錨點,因爲webBrowser的Url爲null(編輯:實際上完成它是關於:空白)。

在這種情況下,如何動態導航到Web瀏覽器控件的html中的錨定標記?

編輯:

感謝sdolphion的小費,這是我用

void _history_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     _completed = true; 
     if (!string.IsNullOrEmpty(_requestedAnchor)) 
     { 
      JumpToRequestedAnchor(); 
      return; 
     } 
    } 

    private void JumpToRequestedAnchor() 
    { 
     HtmlElementCollection elements = _history.Document.GetElementsByTagName("A"); 
     foreach (HtmlElement element in elements) 
     { 
      if (element.GetAttribute("Name") == _requestedAnchor) 
      { 
       element.ScrollIntoView(true); 
       return; 
      } 
     } 
    } 

回答

10

最終的代碼我相信有人有這樣做的更好的辦法,但這裏是我用來完成這項任務。

HtmlElementCollection elements = this.webBrowser.Document.Body.All; 
foreach(HtmlElement element in elements){ 
    string nameAttribute = element.GetAttribute("Name"); 
    if(!string.IsNullOrEmpty(nameAttribute) && nameAttribute == section){ 
     element.ScrollIntoView(true); 
     break; 
    } 
} 
+0

的頂部對準它的只是發現這個網上的參考,現在正在測試它。當我確認時將會標記爲答案。 – johnc 2009-09-18 01:44:12

+0

儘管我使用Document.GetElementByName而不是循環 – johnc 2009-09-18 01:45:22

+0

感謝您發佈我的更新,我將其更改爲與您更接近地匹配。 – sdolphin 2009-09-18 19:07:49

5

我知道這個問題是舊的,有一個偉大的答案,但是這並沒有被建議呢,所以它可能是其他人來這裏尋找答案有用。

另一種方法是使用HTML中的元素ID。

<p id="section1">This is a test section</p>

然後你可以使用

HtmlElement sectionAnchor = webBrowserPreview.Document.GetElementById("section1"); 
if (sectionAnchor != null) 
{ 
    sectionAnchor.ScrollIntoView(true); 
} 

其中webBrowserPreview是您的WebBrowser控件。

另外,sectionAnchor.ScrollIntoView(false)只會帶來屏幕上的元素,而不是與頁面

+0

請原諒我的無知。 「webBrowserPreview」的定義在哪裏? – 2017-03-01 16:12:00

+1

哇,不敢相信我錯過了,現在沒有人注意到。這是您窗體中的WebBrowser控件。我已經給我的回答添加了說明。 – dbooher 2017-03-02 15:34:48