2016-11-30 97 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(); 
} 

因爲瀏覽器是由不同的線程所擁有我使用調度員能夠正確地訪問它。

所有這些代碼運行得很好,沒有任何異常,但在瀏覽器加載時不會打開。

我猜這是因爲我一直無法讓Caliburn.Micro將兩個對象ChromiumWebBrowser綁定在一起。

我該如何做到這一點?

回答

0

您必須添加自定義約定才能綁定到基於x:Name的該控件。沒有辦法解決這個問題,因爲它是第三方控件,否則你將不得不使用屬性。只有那些開箱即用的控件是那些包含在wpf/silver/windows phone framework for .NET中的控件。 。如果內存爲我服務,那麼對於initialize這個特定控件還需要其他一些步驟。這些用於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"); 

爲Telerik的UI定製公約

http://caliburnmicro.com/documentation/conventions

的例子是非常基本的,但讓他們開展相應的工作。

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; 
      }; 

更多涉及到的ItemsControl的的SelectedItem先進約定......

正如你可以看到它完全依賴於控件本身並暴露於使用可用DependencyProperties。