【问题标题】:CEF browser showing old content on the windowCEF 浏览器在窗口中显示旧内容
【发布时间】:2022-10-20 09:13:52
【问题描述】:

我正在为我的 WPF 应用程序创建一个浏览器窗口。在可见性更改期间,我正在加载 URL,但是当我更改 URL 内容并加载相同的 URL 时,它首先显示以前的内容,然后在闪烁后显示更新的数据。

        void OnWindowVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (!IsBrowserInitialized) return;
            if (window.Visibility == Visibility.Visible)
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    LoadNewUrl();
                    window.Activate();
                }));
            }
            else
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    ChromeBrowser.LoadHtml("<html><body><h1></h1></body></html>");
                }));
            }
        }

假设 URL 包含“ABCD”作为数据。第一次显示正确的内容。更新后数据变为“ABCDEF”。现在在Load() 上显示初始内容,然后显示更新的内容。

为了避免这个问题,我还需要做些什么吗?

【问题讨论】:

  • 你用的是什么版本?
  • 我不明白这个问题。您显示浏览器窗口,然后加载新内容,对吗?
  • @amaitland 版本是r104.4.24+gdf482f6+chromium-104.0.5112.102.大部分可在较慢的机器上重现。我使用 cpuiller3 来减慢我的开发机器的速度以重现问题。
  • @273K 显示窗口,我正在加载带有 URL 的内容。在下一次加载期间,它首先显示旧内容,然后闪烁一些,然后才是实际内容。有时窗口只是空白。
  • 请显示更多代码,目前还不清楚问题是什么。加载新内容是一个异步操作。如果您在Load 调用中显示浏览器窗口,您肯定会首先看到旧内容。

标签: wpf cefsharp chromium-embedded


【解决方案1】:

我不确定LoadHtml() 做了什么,它不是本机 CEF API 的一部分。无论如何,空白页是关于:空白,即ChromeBrowser.Load("about:blank")

您是否知道停止隐藏浏览器中的所有活动?这似乎是问题所在 - 您加载一个空页面并隐藏窗口,浏览器停止任何活动,然后您激活窗口并仍然看到旧内容,然后一个空页面导致“闪烁”,最后是一个新内容显示。

您应该捕获更改可见性请求,取消它,加载 about:blank 并在加载完成时隐藏窗口。客户端处理程序具有适当的事件。

【讨论】:

  • 这是一个很好的信息。我可以问一件事 - 如果我在窗口不可见时加载 URL 和当窗口可见时它可以显示内容有什么区别,因为 Chrome 浏览器已经获得了地址。使用此“关于:空白”后,间歇性地发生旧数据问题。任何新可见性之前的最后一个地址只是“about:blank”,那么它如何显示旧数据。
  • 缓存是否保存有效的旧数据而不是 about:blank
  • 你完全误解了我的解释。您不应该期望在Load("about:blank") 之后立即清除窗口。它是异步操作,在Load 之后需要一段时间才能在其他进程和线程中执行许多操作。如果在Load 之前或之后隐藏窗口,则会暂停浏览器。当您取消隐藏窗口时,它会从中断点继续执行操作,因此您会看到旧内容,因为操作尚未完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多