Значение свойства WinForm не установлено

Вот сценарий:

У меня есть флажок, который при инициализации формы для свойства 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 при проверке во время отладки его значение не меняется.

Согласно этому ответу C# stackoverflow.com/a/11161477/880990, свойство Visible установлено правильно внутри, но будет отображаться False до тех пор, пока в самой форме есть Visible = False, что имеет место, поскольку она еще не была открыта.

Olivier Jacot-Descombes 29.04.2024 16:10

Дескриптор элемента управления еще не создан, новое значение кэшируется в битах состояния. Транзакция Layout рассмотрит ее после

Jimi 29.04.2024 16:10

Спасибо... Давно я не работал с WinForms. (Раньше я знал эту неясную информацию).

Paulo Santos 29.04.2024 16:31

Сделайте значение message и логическое значение видимости в качестве параметров конструктора формы и задайте там значения.

HardCode 29.04.2024 18:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо Оливье Жако-Декомбу и Джими за указание на решение.

Пока дескриптор формы (и дескриптор элемента управления) не создан, свойство, в данном случае свойство Visible, хранится только внутри и недоступно извне.

(Довольно странное дизайнерское решение, если вы спросите меня.)

Совсем не странно. Всегда следует учитывать, что значительная часть элементов управления WinForms на самом деле являются элементами управления Win32. Объект .NET часто представляет собой просто оболочку, которая добавляет полезные свойства и методы (и управляет созданием окна Win32). Элементы управления Win32 работают через Win32 API, и для всего этого требуется дескриптор. Таким образом, установка фактических свойств реального элемента управления, когда дескриптор недоступен, может (будет) вызвать каскадные события, эффекты и вызовы API, которые не могут работать правильно и будут генерировать необработанные исключения.

Jimi 29.04.2024 17:18

Элементы управления .NET, которые не являются производными от элементов управления Win32 (например, DataGridView), и компоненты, которым требуется очередь сообщений (например, таймер), также имеют резервное окно Win32, созданное с помощью объекта NativeWindow. Для работы по-прежнему требуется ручка. Дескриптор создается после построения объекта и перед транзакцией макета (когда выполняется макет элемента управления). Об этом сигнализирует метод OnHandleCreated()

Jimi 29.04.2024 18:25

Другие вопросы по теме