Кажется, это ошибка.Когда элемент управления скрыт, он не вычисляет экстенты элементов (что-то вроде Graphics.MeasureString
или его собственный эквивалент), когда они добавляются (что имеет смысл), и не вычисляет его позже, когда отображается элемент управления (что, вероятно, ошибка).По этой причине вы получаете 4 столбца вместо 2. Обратите внимание, что когда вы получаете 2 столбца, элементы не усекаются, потому что был выполнен этот расчет размера.Когда вы получаете 4 столбца, дисплей обычно некорректен.
И почему он не делает его невидимым с самого начала?Причина в том, что в этом случае дескриптор элемента управления не создается (базовый элемент управления Win32 еще не создан) до тех пор, пока вы не вызовете метод Show
или не создадите что-либо, что заставляет этот дескриптор быть создан.И тогда Show
впервые создаст дескриптор, выполняя много другого кода, включая OnHandleCreated
, и где-то в этот момент код организует элементы и вычисляет их размеры.
Вы можете проверитьIsHandleCreated
свойство равно false
до первого Show
вызова, если элемент управления был невидимым с самого начала.
Вы также можете явно создать дескриптор, т.е.просто пытаясь прочитать свойство Handle
(это вынуждает создать дескриптор), а затем он ведет себя так же - быстро, но отображается неверное сообщение:
IntPtr handle = listView1.Handle;
for (int i = 0; i < 5000; i++)
listView1.Items.Add((Guid.NewGuid().ToString()));
listView1.Show();
Если дескриптор былсозданный ранее, OnHandleCreated
вместе с вычислением размера также вызывался, но в то время список был пустым.