Вот сценарий:
У меня есть флажок, который при инициализации формы для свойства Visible
этого флажка устанавливается в значение false.
Затем, во время выполнения программы, свойство Visible
устанавливается в значение true, и программа продолжает свою работу.
Однако, несмотря на то, что флажок виден при отображении формы, СРАЗУ после установки свойства его значение не меняется.
Я разместил видео здесь, чтобы продемонстрировать его во время отладки.
Кто-нибудь видел это?
Впервые я вижу что-то отдаленно похожее на это.
Это выполненный код:
1 | Using frm As New FormLicenseInput(Me, code, product)
2 | frm.Message = msg
3 | frm.CheckDontShow.Visible = _IsInitializing
4 | If frm.OpenDialog(ownerWindow) = DialogResult.Cancel Then
5 | Return Nothing
6 | End If
7 | End Using
Свойство меняется в строке 3, но в строке 4 при проверке во время отладки его значение не меняется.
Дескриптор элемента управления еще не создан, новое значение кэшируется в битах состояния. Транзакция Layout рассмотрит ее после
Спасибо... Давно я не работал с WinForms. (Раньше я знал эту неясную информацию).
Сделайте значение message
и логическое значение видимости в качестве параметров конструктора формы и задайте там значения.
Спасибо Оливье Жако-Декомбу и Джими за указание на решение.
Пока дескриптор формы (и дескриптор элемента управления) не создан, свойство, в данном случае свойство Visible
, хранится только внутри и недоступно извне.
(Довольно странное дизайнерское решение, если вы спросите меня.)
Совсем не странно. Всегда следует учитывать, что значительная часть элементов управления WinForms на самом деле являются элементами управления Win32. Объект .NET часто представляет собой просто оболочку, которая добавляет полезные свойства и методы (и управляет созданием окна Win32). Элементы управления Win32 работают через Win32 API, и для всего этого требуется дескриптор. Таким образом, установка фактических свойств реального элемента управления, когда дескриптор недоступен, может (будет) вызвать каскадные события, эффекты и вызовы API, которые не могут работать правильно и будут генерировать необработанные исключения.
Элементы управления .NET, которые не являются производными от элементов управления Win32 (например, DataGridView), и компоненты, которым требуется очередь сообщений (например, таймер), также имеют резервное окно Win32, созданное с помощью объекта NativeWindow. Для работы по-прежнему требуется ручка. Дескриптор создается после построения объекта и перед транзакцией макета (когда выполняется макет элемента управления). Об этом сигнализирует метод OnHandleCreated()
Согласно этому ответу C# stackoverflow.com/a/11161477/880990, свойство
Visible
установлено правильно внутри, но будет отображатьсяFalse
до тех пор, пока в самой форме естьVisible = False
, что имеет место, поскольку она еще не была открыта.