Я искал способ получить HTML из элемента управления WPF WebBrowser. Два наилучших варианта, которые я нашел, - это привязать прикрепленное к клиенту свойство к свойству приложения или создать новый элемент управления из элемента управления WebBrowser. Учитывая мой уровень знаний и тот факт, что (на данный момент мне действительно нужен только один раз) я выбрал первый. Я даже подумывал о том, чтобы нарушить стиль MVVM и использовать код-позади, но решил не сдаваться в привязке.
Я нашел несколько примеров создания присоединенного свойства, наконец выбрал это, отсюда Здесь :
namespace CumminsInvoiceTool.HelperClasses
{
public static class WebBrowserExtentions
{
public static readonly DependencyProperty DocumentProperty =
DependencyProperty.RegisterAttached("Document", typeof(string), typeof(WebBrowserExtentions), new UIPropertyMetadata(null, DocumentPropertyChanged));
public static string GetDocument(DependencyObject element)
{
return (string)element.GetValue(DocumentProperty);
}
public static void SetDocument(DependencyObject element, string value)
{
element.SetValue(DocumentProperty, value);
}
public static void DocumentPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
{
WebBrowser browser = target as WebBrowser;
if (browser != null)
{
string document = e.NewValue as string;
browser.NavigateToString(document);
}
}
}
}
Я также добавил следующее в xaml для элемента управления WebBrowser (я пробовал как с, так и без «Path =» в xaml:
<WebBrowser local:WebBrowserExtentions.Document="{Binding Path=PageCode}" Source="https://www.cummins-distributors.com/"/>
My View имеет элемент управления вкладками, одна вкладка имеет элемент управления WebBrowser, а другая вкладка имеет текстовое поле. Когда я нажимаю код получения, viewModel запускает функцию, чтобы установить свойство, привязанное к текстовому полю, к строке, к которой привязано присоединенное свойство WebBrowser. Ниже приведен код моей ViewModel.
namespace CumminsInvoiceTool.ViewModels
{
class ShellViewModel : Screen
{
private string _browserContent;
public string BrowserContent
{
get { return _browserContent; }
set {
_browserContent = value;
NotifyOfPropertyChange(() => BrowserContent);
}
}
private string _pageCode;
public string PageCode
{
get { return _pageCode; }
set {
_pageCode = value;
NotifyOfPropertyChange(() => PageCode);
}
}
public void StartProgressCommand()
{
}
public void GetContent()
{
if (!string.IsNullOrEmpty(PageCode))
{
BrowserContent = PageCode;
}
else
{
MessageBox.Show("There is no cintent to show", "No content Error", MessageBoxButton.OK);
}
}
}
}
Приложение компилируется и запускается, но когда я нажимаю «Получить код», я получаю окно сообщения для «Код страницы» пусто.
Когда я устанавливаю точку останова в начале функции для кнопки, строка PageCode показывает «ноль».
Это проблема, потому что я использую Caliburn.Micro или мне не хватает чего-то еще?
------- РЕДАКТИРОВАТЬ для комментариев ----------
Кнопка вызывает GetContent () в приведенном выше коде «ShellViewModel». Я знаю, что кнопка связана и работает, потому что приложение показывает настраиваемое окно сообщений, которое я настроил, чтобы сообщить мне, когда "pageCode" равен нулю или пуст.
Текстовое поле выглядит так:
<TextBox x:Name="BrowserContent"/>