首页 > 解决方案 > 如何在不丢失 CefSharp 浏览器的情况下最小化和最大化 WinForms 表单?

问题描述

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

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

但是,当我隐藏/显示表单时,CefSharp 浏览器似乎没有与表单一起重新绘制。右键单击浏览器应显示的位置显示表单的上下文菜单,而不是浏览器的上下文菜单,这表明浏览器未附加到该表单,而不是浏览器中的网页被错误地绘制。

我最初认为它已失效并需要重新绘制,并尝试了Show, Invalidate, Refresh, Update对 Form、Panel 和 Browser 本身的各种方法调用。我还尝试清除面板控件并再次添加浏览器......这些东西似乎都不起作用。

调试时,浏览器对象存在,具有相同的 URL 和父对象,仍显示“填充”作为停靠模式,具有合理的高度/宽度大小等,因此它看起来不像以某种方式分离来自父母等,当表格再次显示时,它只是没有被重新绘制

是否有隐藏和显示包含 CefSharp 浏览器的表单的“正确”方法,或其他强制浏览器重绘的方法,我错过了?

标签: c#winformscefsharp

解决方案


所以这是我自己的解决方案,在评论中的 Çöđěxěŕ 的帮助下找到了(他还指出使用Show()andHide()根本不是显示/隐藏表单的正确方法,而是使用WindowState

就我而言,问题源于使用Form.ShowInTaskbar

当将 Form.ShowInTaskbar 设置为 False 时(例如,当我刚刚将其最小化到任务栏托盘时,不显示我的应用程序的图标),浏览器控件似乎对哪个窗体是父窗体感到困惑,这似乎是相关的到 Form.Handle 更改。

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

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


推荐阅读