2016-11-30 2 views
0

Я пытаюсь заставить CefSharp хорошо играть с Caliburn.Micro, но это было не так просто, как я надеялся. Это, вероятно, все еще легко, но я просто недостаточно знаком с любым из них.Интеграция CefSharp.WPF с Caliburn.Micro

Я добавил компонент браузера на мой взгляд:

<cefsharp:ChromiumWebBrowser x:Name="Browser"></cefsharp:ChromiumWebBrowser> 

Затем я добавил свойство в моей модели представления с тем же именем:

public ChromiumWebBrowser Browser { get; set; } 

я теперь надеялся, что магия Caliburn.Micro в связал это свойство с фактическим браузером в представлении, чтобы я мог использовать Browser из моего кода.

Чтобы проверить это, я стараюсь идти к определенной веб-странице, когда представление активирован:

protected override void OnActivate() 
{ 
    Browser.Dispatcher.Invoke(() => 
    { 
     Browser.Address = "http://stackoverflow.com"; 
     NotifyOfPropertyChange(() => Browser); 
    }); 
    base.OnActivate(); 
} 

Поскольку браузер принадлежит другой поток Я использую диспетчеру, чтобы иметь возможность доступа к нему должным образом.

Весь этот код работает отлично, без каких-либо исключений, но SO не открывается при загрузке браузера.

Я предполагаю, что это связано с тем, что я не смог получить Caliburn.Micro, чтобы правильно связать два объекта ChromiumWebBrowser.

Как это сделать?

ответ

0

вы должны добавить пользовательскую конвенцию для привязки к этому управлению на основе x:Name. нет никакого способа обойти это, так как это сторонний элемент управления, иначе вам придется использовать свойства. Единственными элементами управления, которые имеют соглашения из коробки, являются те, которые включены в фреймворки wpf/silver/windows для .NET. , Если память обслуживает меня, есть и другие шаги, необходимые для этого конкретного элемента управления для initialize.

http://caliburnmicro.com/documentation/conventions

примеры пользовательских соглашений для UI Telerik для Windows Phone

ConventionManager.AddElementConvention<RadDataBoundListBox>(DataControlBase.ItemsSourceProperty, "ItemsSource", "SelectionChanged"); 
ConventionManager.AddElementConvention<RadDockPanel>(RadDockPanel.DockProperty, "Dock", "DockChanged"); 
ConventionManager.AddElementConvention<RadListPicker>(ItemsControl.ItemsSourceProperty, "ItemsSource", "SelectionChanged"); 
ConventionManager.AddElementConvention<RadDatePicker>(DateTimePicker.ValueProperty, "Value", "ValueChanged"); 
ConventionManager.AddElementConvention<RadTimePicker>(DateTimePicker.ValueProperty, "Value", "ValueChanged"); 
ConventionManager.AddElementConvention<RadToggleSwitch>(RadToggleSwitch.IsCheckedProperty, "IsChecked", "CheckChanged"); 
ConventionManager.AddElementConvention<RadContextMenuItem>(RadContextMenuItem.CommandProperty, "Command", "Tap"); 
ConventionManager.AddElementConvention<RadHubTile>(HubTileBase.CommandProperty, "Command", "Tap"); 

это очень простые, но заставить их работать соответствующим образом.

ConventionManager.AddElementConvention<Pivot>(ItemsControl.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding = 
      (viewModelType, path, property, element, convention) => 
      { 
       if (ConventionManager 
        .GetElementConvention(typeof(ItemsControl)) 
        .ApplyBinding(viewModelType, path, property, element, convention)) 
       { 

        ConventionManager 
         .ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path); 
        ConventionManager 
         .ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, null, viewModelType); 

        return true; 
       } 
       return false; 
      }; 
более

передовых конвенции, связанные с SelectedItem из ItemsControl в ...

Как вы можете видеть его полностью зависит от самого контроля и доступного DependencyProperties открытого для использования.

Смежные вопросы