c# Form.Hide() 与 Form.Opacity = 0

Posted

技术标签:

【中文标题】c# Form.Hide() 与 Form.Opacity = 0【英文标题】:c# Form.Hide() vs. Form.Opacity = 0 【发布时间】:2011-09-05 14:52:16 【问题描述】:

我想知道是否有任何使表单完全透明(而不是隐藏它)的陷阱。例如,我知道这些是隐藏表单时让我感到惊讶的事情:

    如果表单被隐藏,您将无法与其控件交互(无法将 html 添加到网络浏览器控件、无法按下按钮等) 在窗口处于隐藏状态时更改其 WindowState(最小化、最大化等)将导致该窗口在再次显示窗体时出现在您的工作区范围之外。

是否有人在使用不透明度设置为 0(完全透明)的表单时遇到类似问题(或完全不同的问题!)?

【问题讨论】:

您还不能与Form.Opacity = 0 的表单交互吗?因此,如果它是完全透明的,我会认为它会很混乱......可能会试图点击透明窗口后面的东西而无法与另一个窗口进行实际交互......更不用说意外触发某些东西了你的透明窗口。 @bitxwise:+1 ...这正是发生在我身上的事情。 啊,真的!我没有想到这一点。我想您可以更改不透明度并将其移到用户显示范围之外,并删除任务栏图标。不确定这是否值得麻烦。感谢您的输入! Windows 中的所有普通主题是否都支持 Opacity(我特意指的是 Windows Home Server)?如果它不是目标,那么它可能会被忽略。我不知道答案(尽管the documentation 建议支持Windows Server 2008 R2,最新的WHS 是在它之上编写的,而WS 2003 是在旧WHS 之上编写的)。如果没有人知道答案,如果您有兴趣,我可以稍后在我的家庭服务器上尝试。 @pickypg:好点。并非所有主题(或 Windows 版本)都支持不透明度。出于文档目的,我已将评论移至答案。 【参考方案1】:

从对我的评论的赞成票来看,我想我会把它作为答案提交。我不鼓励使用Form.Opacity = 0。即使您可以禁用表单以防止意外交互,但我认为透明表单会覆盖其他窗口并使用户混淆为什么他不能与透明窗口后面的窗口进行交互。

至于Form.Hide() 的问题,我通常将表单响应排队,以便当表单返回到视图(或可见性)时,它会通过队列处理操作(即更改 FormState)。在隐藏时更改表单也会使用户感到困惑。

【讨论】:

“我通常将表单响应排队”...我需要学习如何做到这一点 - 这听起来像是有史以来最有用的事情。可能?也许吧! 据我所知,WinForms 没有开箱即用的功能(就像 WPF 一样)。因此,对于 WinForms,您必须实现自己的 Action 队列,该队列在表单获得焦点时被引用,这应该满足您的基本可见性需求,因为如您所知,表单在隐藏/不可见时无法获得焦点。 这有点令人失望,但我想这并不新鲜。 =) 再次感谢您的所有想法。【参考方案2】:

如果您不再需要该表单,请将其隐藏。 但是,如果您仍然有一个任务或计时器以您想要保留的形式运行,或者您想要保留用户的输入,那么您最好将不透明度设置为 0%。 当我想要隐藏表单但仍处于活动状态时,我会这样做:

frmMain.Opacity = 0; // To make it invisible.
frmMain.VisibleInTaskbar = false; // To make the taskbar entry of the form disappear, and to make sure that the WindowState isn't changed.
frmMain.Enabled = false; // To make sure the user doesn't type something in the form, or presses a button (by pressing enter) by accident.

【讨论】:

以上是关于c# Form.Hide() 与 Form.Opacity = 0的主要内容,如果未能解决你的问题,请参考以下文章

基础表单消失但仅在显示对话框时

Delphi中Form1中有按钮,点击按钮,调用Form2,此时希望Form1关闭,如何解决?

js元素状态切换

C#程序设计-.NET与C#基础

C#中静态与非静态方法比较

非托管 C# 与 C++ [关闭]