CefSharp WPF Web 浏览器不显示或渲染

Posted

技术标签:

【中文标题】CefSharp WPF Web 浏览器不显示或渲染【英文标题】:CefSharp WPF web browser is not displayed Or rendered 【发布时间】:2015-04-14 11:23:39 【问题描述】:

我是 CefSharp 的新手 我创建了一个类库项目并引用了 CefSharp 库来呈现 Web 浏览器,但是我在显示 Web 浏览器时遇到了一些问题。请找到确切的代码

WebBrowser_test1:

 public partial class ChildWidget : Window
    
        public CefSharp.Wpf.ChromiumWebBrowser webView;
        public Widget()
        
            InitializeComponent();
            CefSharp.CefSettings settings = new CefSharp.CefSettings();
            settings.PackLoadingDisabled = true;
            if (CefSharp.Cef.Initialize(settings))
            
                webView = new CefSharp.Wpf.ChromiumWebBrowser();
                main_grid.Children.Add(webView);
                webView.Address = "http://www.google.co.uk";
            
        
    

我在另一个项目中引用了这个库(dll)

public MainWindow()
        
            InitializeComponent();
            Button newbutton = new Button();
            newbutton.Width = 50;
            main_grid.Children.Add(newbutton);
            newbutton.Click += ButtonClick;
        

        private void ButtonClick(object sender, RoutedEventArgs e)
        
            try
            
                Webbrowser_test1.ChildWidget childWidget = new Widget();
                childWidget.Show();
            
            catch (Exception)
            

                throw;
            
          

现在点击按钮,我将打开 (WebBrowser_test1) 子小部件,我将在其中显示网络浏览器..当窗口打开时它显示为空白。

如果我遗漏了什么,请告诉我

【问题讨论】:

【参考方案1】:

在创建ChromiumWebBrowser 后订阅IsBrowserInitializedChanged。然后一旦浏览器初始化,你可以调用Load,你的控件就会显示出来。

...
    _browser = new ChromiumWebBrowser();
    mainGrid.Children.Add(_browser);
    _browser.IsBrowserInitializedChanged += OnIsBrowserInitializedChanged;
...

void OnIsBrowserInitializedChanged(object sender, DependencyPropertyChangedEventArgs e)

    if (_browser.IsBrowserInitialized)
    
        _browser.Load("https://www.google.com/");
    

【讨论】:

【参考方案2】:

我能想到前三个潜在问题。但是很难仅从您的代码中判断真正的问题是什么,因为它与官方示例有点偏离

    Cef.Initialize() 移动到您的 MainWindow 构造函数。它应该只被调用一次来启动CefSharp.BrowserSubprocess.exe 渲染器进程。

    查看我对CefSharp 3 always failing Cef.Initialize() 的回答,了解有关二进制文件及其位置的一些检查事项。 确实,推荐的方法是首先运行 CefSharp.MinimalExample 存储库中的 WPF 示例,然后从那里根据您的用例进行调整。

    如果没有明确设置宽度和高度,我不确定 ChromiumWebBrowser() 是否有效。 0x0 窗口可能不会接收任何呈现的内容。我没有尝试过使用最近的代码。

【讨论】:

您好@Jornh,我遇到了类似的问题,但是当我在 Visual Studio 上运行该应用程序时,它运行良好,但是当我发布时,它一直加载空白页面而不是常规 UI。我还查看了如何发布一次单击应用程序,但这似乎是正确的。你对我有什么建议吗?我已经为此苦苦挣扎了几天。 很抱歉,我与 CefSharp 合作已有几年了。我唯一能建议的是通常的东西,可能会在你的部署中寻找丢失的 DLL 和常见的东西,比如错误,如果你可以附加一个调试器。【参考方案3】:

您是否尝试过替换

webView.Address = "http://www.google.co.uk";

webView.Load("http://www.google.co.uk");

【讨论】:

是的,我已经尝试使用 webView.Load("google.co.uk"); 但我仍然无法完成此操作。 嗯,这通常绝对有效,而且 cefsharp 很棒,所以我认为这是你想要的“控制”用法中略带异国情调的“控制”。我的直觉说这是一生的问题。我建议不要在控件构造函数中调用 Load (正如你所说的你现在正在调用的)。您需要先让 CEF 将 dll ( ~20Mb ) 加载到内存中并初始化。有一个 IsBrowserInitialised 事件可以提供帮助。我还建议创建一个不使用控件的新项目,它只需加载和 CEFSharp 并显示一个网页以熟悉 cef。【参考方案4】:

就像 jornh 提到的那样,您可能必须明确设置 ChromiumWebBrowser 的高度和宽度。如果您不知道确切的大小,将HorizontalAlignmentVerticalAlignment 设置为Stretch(填充父容器)可能也可以。

您是否检查过Cef.Initialize() 是否真的返回true?您可能会丢失一些文件,并且在这种情况下,CefSharp 并不总是给出明确的错误消息。

【讨论】:

以上是关于CefSharp WPF Web 浏览器不显示或渲染的主要内容,如果未能解决你的问题,请参考以下文章

wpf 用cefsharp替代web控件

使用 CEFSharp Web 浏览器的 WPF 应用程序在 clickonce 版本中崩溃

在WPF中使用CefSharp嵌入浏览器

wpf中js调用C#后台方法,使用框架CefSharp

Cefsharp 清除 wpf 中的缓存、cookie 和浏览器数据

cefsharp wpf怎么用