C# 控件应该被禁用和隐藏还是只是隐藏?

C# 控件应该被禁用和隐藏还是只是隐藏?,c#,.net,winforms,controls,C#,.net,Winforms,Controls,在.NET windows窗体上操作控件时,以下哪项是最佳做法?为什么 //Hide control from user and stop control form being useable oControl.Enabled = false; oControl.Visible = false; 或 我一直在使用第一种情况,并且在隐藏控件时总是禁用它,但有人告诉我这是错误的,我应该只隐藏它。我似乎模模糊糊地记得在某个地方读到过这样一段话:如果你不特别禁用一个控件,它可以继续与用户交互 任何启示

在.NET windows窗体上操作控件时,以下哪项是最佳做法?为什么

//Hide control from user and stop control form being useable
oControl.Enabled = false;
oControl.Visible = false;

我一直在使用第一种情况,并且在隐藏控件时总是禁用它,但有人告诉我这是错误的,我应该只隐藏它。我似乎模模糊糊地记得在某个地方读到过这样一段话:如果你不特别禁用一个控件,它可以继续与用户交互


任何启示都值得一提。

启用
指用户是否可以与控件交互(即控件是否灰显)

Visible
表示控件是否显示(通常,如果这是错误的,则根本不会呈现控件,但显然并非始终如此-请参阅本文的评论)

如果未呈现控件,则已启用属性的值将没有影响。

来自:

不具有可见性的图元 可见不参与输入 事件(或命令)不会影响 测量或安排通行证 布局的,不在选项卡序列中, 不会在hit中报告 测试

因此,我认为您可以假设设置
.Enabled=false
是不必要的

更新


我已经检查了
.Visibity
,但不幸的是,它没有说明控件是否被禁用。

除非这是一个特殊的控件,即使在不可见时也可以接收焦点,否则我认为您不需要显式禁用它。仅关闭可见性就足以防止用户与控件交互


然而,我不会说这是“错误的”。我将其描述为“过度杀伤力”。

快速测试表明,设置Visible to false也会禁用该控件的加速键


在Win32下(即,这不适用于Windows窗体),当控件隐藏但未禁用时。我假设这就是您所考虑的参考。

对于标签或文本框等基本控件,我认为使用哪种方法没有任何实际区别

但是考虑一个更复杂的控件,它包含一个计时器来检查是否有新的数据显示;禁用控件也会禁用计时器

如果在不禁用它的情况下使其不可见,计时器仍会触发事件,并且仍会处理任何新数据。如果您也禁用它,则不会处理新数据。 这取决于具体情况,即您想要两种行为中的哪一种


FWIW,我不同意那个告诉你隐藏和禁用是错误的人。我认为在大多数情况下这是不必要的。

对.NET不太清楚,但是actionscript/Flex对于采用布尔值的控件有三个不同的属性

启用

可见的

包含布局


将visible属性设置为false可以保持该属性,并可以影响布局。它仍然由显示渲染器绘制。设置includeInLayout属性可防止它一起渲染。通常,我发现包含所有属性很有用,这取决于我希望控件和视图发生什么。NET中可能有类似的属性。但是我不确定。

如果你问的是可用性问题而不仅仅是技术问题,我不建议你隐藏一些东西(除非你完全改变了应用程序当前的“视图”),因为通常情况下,发现控件被禁用(它会给你一个关于你想做的动作还没有准备好的反馈)就不那么烦人了而不是花几秒钟搜索它,过了一会儿才意识到它必须被禁用,因为使用它的先决条件不满足


如果您已经意识到这一点,请忽略它:-p

隐藏控件时是否需要设置
Enabled=false
,这取决于所讨论的控件以及它提供的交互类型。对于许多控件(如
按钮
复选框
),设置
Visible=false
足以防止用户与控件之间的任何交互

但有些控件(尤其是那些提供快捷键属性的控件)在不可见时仍然提供用户交互。例如,当按下快捷键时,
ToolStripMenuItem
(以及“较旧的”
MenuItem
)仍将调用其
单击
事件,而不管
可见
是否为


设置
Enabled=false
将防止在这些情况下通过快捷键调用
单击事件。从这个角度来看,我不建议在WinForms应用程序中隐藏控件时设置
Enabled=false

请注意,您链接到的文档是指WPF,而不是WinForms。例如,指定了快捷键Visible=False和Enabled=True的ToolStripMenuItem将在按下快捷键时调用其Click事件,即使该快捷键是隐藏的。对不起,我以为我是在浏览WinForms树。我一定是在这条线路的某个地方打错了链接;请参见我在ChrisF回答下对ToolStripMenuItem的评论。
//Hide control from user and stop control form being useable
oControl.Visible = false;