【问题标题】:How to get the Document's Title from a Web Browser control in wpf如何从 wpf 中的 Web 浏览器控件获取文档的标题
【发布时间】:2013-03-27 00:15:33
【问题描述】:

我在 TabControl 中创建了一个 Web 浏览器控件。我想将 TabItem 的 Header 设置为 Web 浏览器的文档标题。 我在 WebBrowser 的导航事件中使用了以下代码

dynamic doc = tabBrowser.Document; //tabBrowser is the name of WebBrowser Control
tab.Header = doc.Title;            //tab is the name of the Tab Item

但是这段代码不能正常工作。标题仅针对少数站点更改。 如何将 tabItem 的 Header 设置为 Document 的 Title 值?

这是导航功能:

    public void tabBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
    { 
       urlTextBox.Text = tabBrowser.Source.ToString(); 
       myHistory.addToHistory(tabBrowser.Source.ToString());
       BookMarks.addBookmark(tabBrowser.Source.ToString()); 
       dynamic doc = tabBrowser.Document; 
       tab.Header = doc.Title; 
    }

【问题讨论】:

  • 您确定每次页面都完全呈现并加载了吗?请注意,任何动态更改其标题的网站也将无法运行,您能否提供一些周边代码?例如执行导航和处理导航事件的代码?
  • 这里是导航函数public void tabBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) { urlTextBox.Text = tabBrowser.Source.ToString(); myHistory.addToHistory(tabBrowser.Source.ToString()); BookMarks.addBookmark(tabBrowser.Source.ToString()); dynamic doc = tabBrowser.Document; tab.Header = doc.Title; }

标签: c# wpf wpf-controls webbrowser-control tabcontrol


【解决方案1】:

在我的代码中,我使用了 WebBrowser 的 LoadCompleted 事件。可能在您的导航事件文档中仍未准备好并且文档标题不正确或为空。

private void MyWebBrowser_LoadCompleted_1(object sender, NavigationEventArgs e)
{
    try
    {
        MyTextBox.Text = MyWebBrowser.Source.ToString();
        Title_doc.Content = ((dynamic)MyWebBrowser.Document).Title;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

【讨论】:

    【解决方案2】:

    这个可以用

    var docTitle = document.getElementsByTagName("title")
        .Cast<IHTMLElement>()
        .FirstOrDefault().innerText; 
    

    【讨论】:

      【解决方案3】:

      (dynamic)Document 转换至少在操作期间文档更改时会失败(操作无法完成,NotSupportedException,原因 8070000c),如果用户单击链接过快会发生这种情况。

      根据Wpf webbrowser disable external links question UPDATE 2 链接https://social.technet.microsoft.com/wiki/contents/articles/22943.preventing-external-links-from-opening-in-new-window-in-wpf-web-browser.aspx找到另一个合理的解决方案

      DWebBrowserEvents 具有 TitleChanged 事件,该事件似乎工作可靠,因此从那里调整代码,并将处理程序添加到此事件。

      wbEvents.TitleChange += new SHDocVw.DWebBrowserEvents_TitleChangeEventHandler(OnWebBrowserTitleChanged);
      

      处理程序只有一个参数,即字符串形式的新标题。

      void OnWebBrowserTitleChanged(string title)
      {
           // Set title where you want
      }
      

      有点重,但我需要这两个才能工作......

      链接的代码还有其他问题,比如在 WebBrowser 的每个 LoadCompleted 事件上再次添加事件处理程序

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2016-05-23
        • 2013-03-07
        • 2011-04-13
        • 1970-01-01
        相关资源
        最近更新 更多