4

我正在将 CefSharp 用于 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属性 (in Browser) 是false

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

有人在 WPF MVVM 应用程序中获得 CefSharp 吗?有任何想法吗?

谢谢

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

4

2 回答 2

8

不幸的是,目前 CefSharp 版本 1 不太适合 MVVM。幸运的是,在 CefSharp 3 中,我试图让它更“支持 MVVM”,这样你就不必做很多 hack。在那里查看CefSharp.Wpf.Example 代码,你会(希望)明白我的意思。

让它与 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;
        }
    }
于 2013-10-26T18:58:37.463 回答
0

我很欣赏这是一个老问题,可能在其他地方得到了回答,但鉴于简洁的标题谷歌可能会将您发送到这里(它对我有用!)

底层的 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}" />
于 2021-04-16T08:40:25.207 回答