如何在不丢失 CefSharp 浏览器的情况下最小化和最大化 WinForms 表单?

How do I minimize and maximize a WinForms form without losing my CefSharp browser?

我将 CefSharp 浏览器添加为 WinForms 面板的控件。这在第一次加载时很好 - 浏览器按预期工作。

此应用程序定期最小化到任务栏,这是通过在窗体上调用 hide() 和 show() 来完成的。这适用于表单,并且适用于嵌入式 Internet Explorer 浏览器(默认的 WebBrowser 控件)

但是,当我 hide/show 表单时,CefSharp 浏览器似乎没有随表单一起重新绘制。右键单击浏览器所在的位置会显示表单的上下文菜单,而不是浏览器的上下文菜单,这表明浏览器未附加到该表单,而不是浏览器中的网页绘制不正确。

我最初假设它正在失效并需要重新绘制,并且在窗体、面板和浏览器本身上尝试了各种 Show, Invalidate, Refresh, Update 方法调用。我也试过清除面板控件并再次添加浏览器...none 这些东西似乎有效。

调试时,浏览器对象存在,具有相同的 URL 和父级,仍显示 "fill" 作为停靠模式,具有合理的外观 height/width 大小等,所以它看起来并没有以某种方式与父级等分离,只是在再次显示表单时没有重新绘制

是否有我缺少的 "correct" 方法来隐藏和显示包含 CefSharp 浏览器的表单,或其他强制浏览器重绘的方法?

所以这是我自己的解决方案,是在评论中 Çöđěxěŕ 的帮助下找到的(他还指出使用 Show()Hide() 不是 show/hide a 的正确方法形式,而不是使用 WindowState)

在我的例子中,问题出在使用 Form.ShowInTaskbar

将 Form.ShowInTaskbar 设置为 False 时(例如,当我刚刚将其最小化到任务栏托盘时不显示我的应用程序的图标),浏览器控件似乎对哪个表单是parent,这似乎与 Form.Handle 变化有关。

我的解决方案是在应用程序加载时将 ShowInTaskBar 设置为 false(因此应用程序永远不会在任务栏中)或者在最小化时不将其设置为 false(因此当最小化到系统托盘时它总是在任务栏中) .这些都不是理想的解决方案,但它们都需要注意您必须始终隐藏或从不隐藏该应用程序。

大概可以在最大化时正确地重新分配父对象

使用 this.WindowState = FormWindowState.Maximized; Please see the scrrenshot