CefSharp WPF and MVVM?

本文关键字:MVVM and WPF CefSharp | 更新日期: 2023-09-27 18:20:28

我正在使用头孢夏普进行WPF。我想在MVVM体系结构中使用它。不幸的是,出现了一个问题。在我看来:

<ContentPresenter Content="{Binding Browser}"
                  HorizontalAlignment="Center"
                  VerticalAlignment="Center"/>

在ViewModel中,我将一个新对象放入Browser:

var settings = new CefSharp.Settings
{
    PackLoadingDisabled = true,
}
if (CefSharp.CEF.Initialize(settings))
{
    int counter = 0;
    this.Browser = new WebView();
}

不幸的是,在那之后的任何时候我都无法加载任何URL。它说Browser not initialized,实际上IsBrowserInitialized的属性(在Browser中)是false

这很奇怪,因为在测试应用程序中,而不是MVVM中,我使用了相同的代码来实例化它工作的WebView。唯一的区别是,我以编程方式将浏览器添加到网格中,因为它不是MVVM。

有人在WPF MVVM应用程序中获得了CefSharp吗?有什么想法吗?

感谢

编辑:我在测试非MVVM应用程序中注意到,IsBrowserInitialized属性设置为false,直到窗口构造函数结束作业。

CefSharp WPF and MVVM?

不幸的是,CefSharp版本1目前不太适合MVVM。幸运的是,在CefSharp 3中,我试图让它更"MVVM意识",这样你就不必做很多黑客操作了。请参阅CefSharp.Wpf.那里的示例代码,您将(希望)明白我的意思。

使用CefSharp 1.xx版本的方法是设置一个PropertyChanged事件处理程序。一旦IsBrowserInitialized属性设置为true,就可以开始工作了。像这样:

    webView.PropertyChanged += OnWebViewPropertyChanged;
    // ...
    private void OnWebViewPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        switch (e.PropertyName)
        {
            case "IsBrowserInitialized":
                if (webView.IsBrowserInitialized)
                {
                    webView.Load("http://some/url");
                }
                break;
        }
    }

我很感激这是一个老问题,可能在其他地方得到了答案,但考虑到简洁的标题,谷歌可能会把你送到这里(它为我做了!)

ChromiumWebBrowser的底层对MVVM非常友好。。

  • 在xaml中创建控件,以便在其他控件中作为源/目标进行绑定。例如回绑定按钮
  • 并可选择在视图模型(也称为MVVM)中创建控件,例如更复杂的浏览器管理,如调用js、连接事件等

示例。。

<cefSharp:ChromiumWebBrowser name="browser" WebBrowser="{Binding WebBrowser, Mode=OneWayToSource}"
 Address="{Binding Address, Mode=TwoWay}"
 RenderOptions.BitmapScalingMode="{Binding ElementName=scalingModeComboBox, Path=SelectedItem}" />