Получить заголовок из документа, который загружен в элемент управления WebBrowser - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть текстовый блок и веб-браузер управления. У меня проблема, например, мой браузер переходит на google.com. Я хочу, чтобы текстовый блок сменил название на google.com, когда веб-браузер перешел на google.com.

Пожалуйста, помогите мне достичь этого с помощью c #.

Ответы [ 5 ]

6 голосов
/ 05 апреля 2011

Протестировано с 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 голос
/ 05 апреля 2011

Вы можете извлечь тег заголовка из свойства Text webBrowser, просто подпишитесь на LoadCompleted событие

0 голосов
/ 07 июня 2015

Просто небольшие опечатки для ответа выше Erno de Weerd для .NET 4.5 *) имя свойства - IHTMLDocument2_nameProp *) исправить опечатку в блоке if

  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);
    }
}
0 голосов
/ 08 декабря 2014

Этот будет работать

var docTitle = document.getElementsByTagName("title")
        .Cast<IHTMLElement>()
        .FirstOrDefault().innerText;    
0 голосов
/ 05 апреля 2011

Существует проблема со свойством Document.Title, так как если заголовок был установлен или изменен, как в javascript, вы не получите последнее значение после установки.

Вместо использования веб-браузера по умолчанию в WPF мы используем FormsHost и веб-браузер Windows Form, который поддерживает свойство 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(""));
}

Может потребоваться еще немного кода, чтобы реализовать немного больше, но все возможно, добавив больше свойств зависимостей и управляя логикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...