CefSharp.WPF integration with Caliburn.Micro



我试图让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相关的更高级约定...

您可以看到它完全取决于控件本身和暴露于使用的可用依赖关系。

最新更新