在.NET窗体上操作控件时,以下哪项是最佳实践?为什么?
//Hide control from user and stop control form being useable
oControl.Enabled = false;
oControl.Visible = false;
或
//Hide control from user and stop control form being useable
oControl.Visible = false;
我一直在使用第一个案例并且在隐藏它时总是禁用控件,但我被告知这是错误并且我应该只隐藏它。我似乎依稀记得在某个地方阅读如果你没有明确地让一个控件可以继续与用户交互。
任何启示都会被贬低。
答案 0 :(得分:9)
Enabled
指的是用户是否可以与控件交互(即控件是否显示为灰色)
Visible
指示是否显示控件(通常如果这是假的,控件根本不会呈现,但显然不是所有时间 - 请参阅本文的评论)。
如果未呈现控件,则启用的属性的值将不会产生任何影响。
答案 1 :(得分:9)
隐藏控件时是否需要设置Enabled = false
取决于所讨论的控件,以及它提供的交互类型。对于许多控件(例如Button
或CheckBox
),设置Visible = false
就足以阻止用户与控件之间的任何交互。
但是一些控件(似乎特别是那些提供快捷键属性的控件)仍会在不可见时提供用户交互。例如,ToolStripMenuItem
(以及“较旧的”MenuItem
)在按下快捷键时仍会调用Click
事件,而不管Visible
为true
}或false
。
设置Enabled = false
将阻止在这些情况下通过快捷键调用Click
事件。从这个角度来看,当在WinForms应用程序中隐藏控件时,我 not 建议不要设置Enabled = false
。
答案 2 :(得分:8)
来自MSDN:
可见性不是的元素 可见不参与投入 事件(或命令),不要影响 测量或排列通过 布局,不在标签序列中, 并且不会在命中报道 测试
所以我认为您可以假设设置.Enabled = false
是不必要的。
<强>更新强>
我已经检查了.Visibity
documentation on the MSDN,但不幸的是,它没有说明控件是否被禁用。
答案 3 :(得分:5)
快速测试表明,将Visible设置为false也会禁用该控件的加速键。
在Win32下(即,这不适用于Windows窗体),accelerators remain enabled当控件被隐藏但未被禁用时。我认为这是你想到的参考。
答案 4 :(得分:3)
对于标签或文本框等基本控件,我认为使用哪种方法并不会产生任何实际差异。
但是考虑一个更复杂的控件,它包含一个计时器来检查是否有新数据要显示;禁用控件也会禁用计时器。
如果在不禁用它的情况下使其不可见,则计时器仍会触发事件,并且仍会处理任何新数据。如果您也禁用它,则不会处理新数据。 这取决于具体情况,你想要的两种行为中的哪一种。
FWIW,我不同意那个告诉你隐藏和禁用错误的人。在大多数情况下,我认为这是不必要的。
答案 5 :(得分:3)
如果您还要询问可用性而不仅仅是技术问题,我建议您不要隐藏任何内容(除非您完全更改应用程序的当前“视图”),因为通常情况下找一个控件不那么烦人禁用(它给你一个关于你想做的动作尚未准备好的反馈),而不是花几秒钟搜索它,只是为了意识到它必须被禁用,因为使用它的先决条件不满意。
如果您已经意识到这一点,请忽略它:-p
答案 6 :(得分:2)
除非这是一些即使在隐身时也能获得焦点的特殊控件,我认为你不需要明确地禁用它。只需关闭可见性就足以防止用户与控件交互。
但是,我不会说它是“错误的”。我将其描述为“过度杀伤”。答案 7 :(得分:1)
不确定.NET,但actionscript / Flex对于采用布尔值的控件有三个不同的属性。
启用
可见
includeInLayout
将visible属性设置为false会使其保持不变并影响布局。它仍然由显示渲染器绘制。设置includeInLayout属性可以防止它被一起渲染。通常我发现根据控件和视图的要求包含所有属性很有用。 .NET中可能有类似的属性。但我不确定。