CefSharp.WPF与Caliburn.Micro集成

时间:2016-11-30 15:22:27

标签: c# wpf mvvm caliburn.micro cefsharp

我正在努力让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();
}

因为浏览器由不同的线程拥有,所以我正在使用Dispatcher来正确访问它。

所有这些代码都运行正常,没有任何例外,但是在浏览器加载时不会打开SO。

我猜这是因为我无法让Caliburn.Micro将两个ChromiumWebBrowser对象正确绑定在一起。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您必须添加自定义约定以基于x:Name绑定到该控件。没有办法解决这个问题,因为它是第三方控制,否则你将不得不使用属性..开箱即用的唯一控件是包含在wpf / silver / windows phone框架中的控件对于.NET。如果内存为我服务,那么该特定控件还需要一些其他步骤来initialize

http://caliburnmicro.com/documentation/conventions

Telerik用于Windows Phone的UI的自定义约定示例

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

正如您所看到的,它完全依赖于控件本身以及可供使用的可用DependencyProperties。

相关问题