c# - 如何在不丢失 CefSharp 浏览器的情况下最小化和最大化 WinForms 表单?
问题描述
我有一个 CefSharp 浏览器作为控件添加到 WinForms 面板。这在第一次加载时很好 - 浏览器按预期工作。
此应用程序定期最小化到任务栏,这是通过在表单上调用 hide() 和 show() 来完成的。这适用于表单,并且适用于嵌入式 Internet Explorer 浏览器(默认 WebBrowser 控件)
但是,当我隐藏/显示表单时,CefSharp 浏览器似乎没有与表单一起重新绘制。右键单击浏览器应显示的位置显示表单的上下文菜单,而不是浏览器的上下文菜单,这表明浏览器未附加到该表单,而不是浏览器中的网页被错误地绘制。
我最初认为它已失效并需要重新绘制,并尝试了Show, Invalidate, Refresh, Update
对 Form、Panel 和 Browser 本身的各种方法调用。我还尝试清除面板控件并再次添加浏览器......这些东西似乎都不起作用。
调试时,浏览器对象存在,具有相同的 URL 和父对象,仍显示“填充”作为停靠模式,具有合理的高度/宽度大小等,因此它看起来不像以某种方式分离来自父母等,当表格再次显示时,它只是没有被重新绘制
是否有隐藏和显示包含 CefSharp 浏览器的表单的“正确”方法,或其他强制浏览器重绘的方法,我错过了?
解决方案
所以这是我自己的解决方案,在评论中的 Çöđěxěŕ 的帮助下找到了(他还指出使用Show()
andHide()
根本不是显示/隐藏表单的正确方法,而是使用WindowState
)
就我而言,问题源于使用Form.ShowInTaskbar
当将 Form.ShowInTaskbar 设置为 False 时(例如,当我刚刚将其最小化到任务栏托盘时,不显示我的应用程序的图标),浏览器控件似乎对哪个窗体是父窗体感到困惑,这似乎是相关的到 Form.Handle 更改。
我的解决方案是在应用程序加载时将 ShowInTaskBar 设置为 false(因此应用程序永远不会在任务栏中),或者在最小化时不将其设置为 false(因此当最小化到系统托盘时它总是在任务栏中)。这些都不是一个理想的解决方案,但它们与您必须始终隐藏或从不隐藏应用程序的警告一起工作。
大概可以在最大化时正确地重新分配父级
推荐阅读
- java - RecycleViewer 没有附加适配器。网址也有错误
- vba - EXCEL VBA 中未设置对象变量 - VLOOKUP
- r - R:网页抓取 xls 页面
- python - 将多个字段转换为单个字段
- c# - 将数据从 GridView 同步到本地数据库
- laravel - SQLSTATE [42000]:语法错误或访问冲突:1066 在 laravel -{5.7} 中不是唯一的表/别名
- vuex - axios调用后如何使Vuex状态更新
- javascript - 尝试访问路由参数时,我只得到它的一部分,# 之后的所有内容都被切断
- c# - 如何将 Linq 转换为 Sql?
- rust - 如何使用 Rust 关键字作为查询动态参数创建端点?