Существует ли MVVM-дружественный способ использовать управление WebBrowser в WPF?

Я изменяю следующую строку в ui.theme.css:

.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }

к:

.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 12px; }
11
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

Я использовал это в моей связываемой оболочке веб-браузера:

    CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseBack, BrowseBack, CanBrowseBack));
    CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseForward, BrowseForward, CanBrowseForward));
    CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseHome, GoHome, TrueCanExecute));
    CommandBindings.Add(new CommandBinding(NavigationCommands.Refresh, Refresh, TrueCanExecute));
    CommandBindings.Add(new CommandBinding(NavigationCommands.BrowseStop, Stop, TrueCanExecute));

Обратите внимание, что я создал свой связываемый веб-браузер как FrameworkElement, который предоставляет DependencyProperties и вызывает методы для фактического элемента браузера, поэтому я могу установить для него CommandBindings.

Таким образом, вы можете использовать NavigationCommands по умолчанию в вашем представлении. Используемые обработчики:

private void CanBrowseBack(object sender, CanExecuteRoutedEventArgs e) {
    e.CanExecute = webBrowser.CanGoBack;
}

private void BrowseBack(object sender, ExecutedRoutedEventArgs e) {
    webBrowser.GoBack();
}

private void CanBrowseForward(object sender, CanExecuteRoutedEventArgs e) {
    e.CanExecute = webBrowser.CanGoForward;
}

private void BrowseForward(object sender, ExecutedRoutedEventArgs e) {
    webBrowser.GoForward();
}

private void TrueCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; }

private void Refresh(object sender, ExecutedRoutedEventArgs e) {
    try { webBrowser.Refresh(); }
    catch (Exception ex) { PmsLog.LogException(ex, true); }
}

private void Stop(object sender, ExecutedRoutedEventArgs e) {
    mshtml.IHTMLDocument2 doc = WebBrowser.Document as mshtml.IHTMLDocument2;
    if (doc != null)
        doc.execCommand("Stop", true, null);
}
private void GoHome(object sender, ExecutedRoutedEventArgs e) {
    Source = new Uri(Home);
}
4
ответ дан 3 December 2019 в 10:44
поделиться

Похоже, ваш вопрос подразумевает, что для правильной реализации шаблона MVVM вам не разрешено иметь какой-либо код программной части. Но, возможно, добавление некоторого кода программной части к вашему представлению значительно упростит его подключение к вашей модели представления. Вы можете добавить в представление свойства зависимости и позволить ему прослушивать события INotifyPropertyChanged .

0
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: