我试图让cefsharp与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
对象正确绑定在一起。
我该如何完成?
您必须添加自定义约定才能基于x:Name
绑定到该控件。由于它是第三方控件,因此无法解决该问题,否则您将必须使用属性。.唯一包含约定的控件是WPF/Silver/Windows Phone Phone Framework(.net)中包含的。。如果内存为我服务,那么该特定控件也需要其他一些步骤才能initialize
。
http://caliburnmicro.com/documentation/conventions
telerik的UI的自定义约定示例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;
};
与itemscontrol的selecteditem相关的更高级约定...
您可以看到它完全取决于控件本身和暴露于使用的可用依赖关系。