Должен ли элемент управления быть отключен и скрыт или просто скрыт? - PullRequest
9 голосов
/ 13 июля 2009

При манипулировании элементами управления в форме Windows .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;

Я использовал первый случай и всегда отключал элемент управления, когда скрывал его, но мне сказали, что это неправильно и что я должен его только скрывать. Кажется, я смутно помню, что где-то читал, что если вы не отключите элемент управления, он может продолжать взаимодействовать с пользователем.

Любое просветление будет оценено.

Ответы [ 8 ]

9 голосов
/ 13 июля 2009

Нужно ли устанавливать Enabled = false при скрытии элемента управления, зависит от рассматриваемого элемента управления и от того, какой тип взаимодействия он предлагает. Для многих элементов управления (таких как Button или CheckBox) достаточно установить значение Visible = false, чтобы предотвратить любое взаимодействие между пользователем и элементом управления.

Но некоторые элементы управления (по-видимому, особенно те, которые предлагают свойство сочетания клавиш) будут по-прежнему предлагать взаимодействие с пользователем, когда его не видно. Например, ToolStripMenuItem (и «старшее» MenuItem) все равно будет вызывать событие Click при нажатии сочетания клавиш, независимо от того, является ли Visible true или false.

Установка Enabled = false предотвратит вызов события Click с помощью сочетаний клавиш в этих случаях. С этой точки зрения я бы не рекомендовал бы против установки Enabled = false при скрытии элемента управления в приложении WinForms.

9 голосов
/ 13 июля 2009

Enabled относится к тому, может ли пользователь взаимодействовать с элементом управления (т. Е. Неактивен ли элемент управления или нет)

Visible относится к тому, отображается ли элемент управления или нет (обычно, если это неверно, элемент управления вообще не отображается, но, видимо, не всегда - см. Комментарии к этой записи).

Если элемент управления не отображается, то значение включенного свойства не окажет влияния.

8 голосов
/ 13 июля 2009

Из MSDN :

Элементы, где видимость не Видимые не участвуют в вводе события (или команды), не влияющие Проходы Мера или Аранжировка макета, не в последовательности вкладок, и не будет сообщено в попадании тестирование.

Так что я думаю, вы можете предположить, что настройка .Enabled = false не нужна.

UPDATE

Я проверил документацию .Visibity на MSDN , но, к сожалению, ничего не говорится о том, отключен элемент управления или нет.

5 голосов
/ 13 июля 2009

Быстрый тест показывает, что установка Visible в false также отключает клавиши ускорения для этого элемента управления.

Под Win32 (т.е. это не относится к Windows Forms), ускорители остаются включенными , когда элемент управления скрыт, но не отключен. Я предполагаю, что это ссылка, о которой вы думали.

3 голосов
/ 13 июля 2009

Если вы спрашиваете также о юзабилити, а не о технических вопросах, я не рекомендую вам что-то скрывать (если вы полностью не меняете текущий «вид» своего приложения), потому что обычно поиск элемента управления менее раздражает отключено (оно дает вам отзыв о том, что вы хотите сделать, еще не готово), чем потратить несколько секунд на его поиск, просто чтобы через некоторое время понять, что оно должно быть отключено, потому что предварительные условия для его использования не выполнены. *

Если вы уже знали об этом, просто проигнорируйте это: -p

3 голосов
/ 13 июля 2009

Для базовых элементов управления, таких как метки или текстовые поля, я не думаю, что это имеет какое-то реальное значение, какой метод вы используете.

Но рассмотрим более сложный элемент управления, который содержит таймер для проверки наличия новых данных для отображения; отключение элемента управления также отключает таймер.

Если вы сделаете его невидимым, не отключив его, таймер по-прежнему будет генерировать события, и все новые данные будут обрабатываться. Если вы отключите его, новые данные не будут обработаны. Это зависит от конкретного случая, какой из двух вариантов поведения вы хотите.

FWIW, я не согласен с человеком, который сказал вам, что было неправильно скрывать и отключать. Я думаю, что в большинстве случаев это не нужно.

2 голосов
/ 13 июля 2009

Если это не какой-то особый элемент управления, который может получать фокус, даже когда он невидим, я не думаю, что вам нужно явно отключить его. Простое отключение видимости должно быть достаточным для предотвращения взаимодействия пользователя с элементом управления.

Однако я бы не сказал, что это «неправильно». Я бы описал это как «перебор».

1 голос
/ 13 июля 2009

Не уверен насчет .NET, но Actionscript / Flex имеет три различных свойства для элементов управления, которые принимают логические значения.

включено

Виден

includeInLayout

Установка свойства visible в false сохраняет его и может влиять на макет. Это все еще нарисовано рендером показа. Установка свойства includeInLayout предотвращает его одновременную визуализацию. Часто я считаю полезным включать все свойства в зависимости от того, что я хочу, чтобы это происходило с элементом управления и моим представлением. В .NET может быть похожее свойство. Но я не уверен.

...