从WebBrowser控件中加载的文档中获取标题

时间:2011-04-05 08:03:26

标签: c# wpf xaml

我有一个文本块和一个webbrowser控件。我有一个问题,例如,我的webbrowser导航到google.com。当webbrowser导航到google.com时,我希望文本块将标题更改为google.com。

请使用c#帮助我实现这一目标。

5 个答案:

答案 0 :(得分:6)

使用IE进行测试

XAML:

<Grid>
    <WebBrowser LoadCompleted="webBrowser1_LoadCompleted" Height="100" HorizontalAlignment="Left" Margin="73,72,0,0" Name="webBrowser1" VerticalAlignment="Top" Width="200" />
    <Button Content="Go" Click="Button_Click" HorizontalAlignment="Right" VerticalAlignment="Bottom"/>
</Grid>

代码:

private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
{
    dynamic doc = webBrowser1.Document;
    this.Title = doc.Title;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    webBrowser1.Navigate("http://google.com");
}

没有dynamic且几乎没有任何异常处理:

private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
{
    Object doc = webBrowser1.Document;
    this.Title = GetPropertyValue<string>(doc, "Title");
}

private T GetPropertyValue<T>(object obj, string propertyName)
{
    Type objectType = obj.GetType(); 
    PropertyInfo propertyInfo = objectType.GetProperty(propertyName);
    Type propertyType = propertyInfo.PropertyType;
    if(propertyType == typeof(T))
    {
        object propertyValue = (T)info.GetValue(obj, null);   
        return value;
    }
    else
    {
        throw new Exception("Property " + propertyName + " is not of type " + T);
    }
}

答案 1 :(得分:1)

您可以从webBrowser的Text属性中提取标题标记,只需订阅LoadCompleted事件

答案 2 :(得分:0)

Document.Title属性存在问题,就像在javascript中设置或更改标题一样,一旦设置,您将无法获得最新值。

我们不使用WPF中的默认Web浏览器,而是使用FormsHost,我们使用Windows Form的Web浏览器,它支持DocumentTitle属性和DocumentTitleChanged事件。

因此我建议使用以下控件,您可以使用表单版本中提供的更多功能。如果你仔细注意,两者的性能完全相同,因为它们都创建了一个win32控件并与之交互。

public class FormsWebBrowser : 
    System.Windows.Forms.Integration.WindowsFormsHost
{

    System.Windows.Forms.WebBrowser Browser = 
        new System.Windows.Forms.WebBrowser();

    public FormsWebBrowser()
    {
        Child = Browser;
        Browser.DocumentTitleChanged += 
            new EventHandler(Browser_DocumentTitleChanged);
    }

    void Browser_DocumentTitleChanged(object sender, EventArgs e)
    {
        this.DocumentTitle = Browser.DocumentTitle;
    }

    ///<summary>
    /// This will let you bind
    ///</summary>
    public string DocumentTitle
    {
        get { return (string)GetValue(DocumentTitleProperty); }
        private set { SetValue(DocumentTitleProperty, value); }
    }

    public static readonly DependencyProperty DocumentTitleProperty =
        DependencyProperty.Register("DocumentTitle", typeof(string), 
        typeof(FormsWebBrowser), new FrameworkPropertyMetadata(""));
}

可能需要更多的代码来实现一些额外的功能,但通过添加更多的依赖项属性和控制逻辑,一切都是可能的。

答案 3 :(得分:0)

这个会起作用

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

答案 4 :(得分:0)

针对.NET 4.5的Erno de Weerd上面的回答只是一些错误的修补程序 *)属性名称是IHTMLDocument2_nameProp *)修复if block

中的拼写错误
  private void webBrowser1_LoadCompleted(object sender, NavigationEventArgs e)
{
    Object doc = webBrowser1.Document;
    this.Title = GetPropertyValue<string>(doc, "IHTMLDocument2_nameProp");
}

private T GetPropertyValue<T>(object obj, string propertyName)
{
    Type objectType = obj.GetType(); 
    PropertyInfo propertyInfo = objectType.GetProperty(propertyName);
    Type propertyType = propertyInfo.PropertyType;
    if(propertyType == typeof(T))
    {
        object alue = (T)propertyInfo.GetValue(obj, null);   
        return value;
    }
    else
    {
        throw new Exception("Property " + propertyName + " is not of type " + T);
    }
}