【问题标题】:Should a control be disabled and hidden or just hidden?控件应该被禁用和隐藏还是只是隐藏?
【发布时间】:2010-11-10 05:46:07
【问题描述】:

在 .NET Windows 窗体上操作控件时,以下哪一项是最佳实践?为什么?

//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;

我一直在使用第一种情况,并且在隐藏控件时总是禁用它,但有人告诉我这是错误,我应该只隐藏它。我似乎隐约记得在某处读过,如果您不专门禁用一个控件,它可以继续与用户交互。

任何启蒙都会受到赞赏。

【问题讨论】:

    标签: c# .net winforms controls


    【解决方案1】:

    隐藏控件时是否需要设置Enabled = false 取决于相关控件及其提供的交互类型。对于许多控件(例如ButtonCheckBox),设置Visible = false 就足以阻止用户和控件之间的任何交互。

    但某些控件(似乎尤其是那些提供快捷键属性的控件)在不可见时仍会提供用户交互。例如,ToolStripMenuItem(和“旧”MenuItem)在按下快捷键时仍会调用其Click 事件,无论Visibletrue 还是false

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

    【讨论】:

      【解决方案2】:

      Enabled指的是用户能否与控件交互(即控件是否变灰)

      Visible 指的是是否显示控件(通常如果这是 false,则控件根本不会呈现,但显然不是一直呈现 - 请参阅这篇文章的 cmets)。

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

      【讨论】:

      • 并非总是如此;在 ChrisF 的回答下查看我对 ToolStripMenuItem 的评论。
      【解决方案3】:

      来自MSDN

      不可见性的元素 可见不参与输入 事件(或命令),不影响 测量或排列通道 布局,不在制表符序列中, 并且不会在hit中报告 测试。

      所以我认为你可以假设设置.Enabled = false 是不必要的。

      更新

      我检查了.Visibitydocumentation on the MSDN,但不幸的是它没有说明控件是否被禁用。

      【讨论】:

      • 请注意,您链接到的文档是指 WPF,而不是 WinForms。例如,一个 ToolStripMenuItem 分配了一个快捷键,Visible=False 和 Enabled=True 将在按下快捷键时调用它的 Click 事件,即使它是隐藏的。
      • 对不起 - 我以为我在钻取 WinForms 树。我一定是在某处打错了链接。
      【解决方案4】:

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

      在 Win32 下(即这不适用于 Windows 窗体),accelerators remain enabled 当控件隐藏但未禁用时。我认为这是您正在考虑的参考。

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            除非这是一些特殊控件,即使在不可见时也可以接收焦点,我认为您不需要明确禁用它。只需关闭可见性就足以防止用户与控件进行交互。

            但是,我不会说这是“错误的”。我会把它描述为“矫枉过正”。

            【讨论】:

              【解决方案8】:

              不确定 .NET,但 actionscript/Flex 为采用布尔值的控件提供了三个不同的属性。

              启用

              可见

              includeInLayout

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-11-13
                • 2017-09-11
                • 2011-07-27
                • 1970-01-01
                • 2020-05-12
                • 2019-10-03
                • 2018-03-22
                相关资源
                最近更新 更多