Здравствуйте, Аноним, Вы писали:
А>Да важно в первую очередь вам понимать что Measure — это панель хочет узнать какой размер планирует занять ваш контрол, а не указывает размер для вашего контрола. И вешать на Measure проверку высоты контрола — глупо, собственно не удивительно что после этого контрол получает неадекватное поведение. Почитайте про Measure и Arrange.
Вы понимаете, что когда контрол стрейчится, он на межуре как раз и скажет, что ему надо получить максимально возможную ширину, и если ему предложили бесконечность, то он постарается растянуться по максимуму, а для этого ему надо посчитаться, а для этого создать все возможные строки. Если вы думаете, что это такая проблема в нашем гриде, то я развею ваше заблуждение, стандартные контролы ведут себя абсолютно так же, единственное НО, они не сообщают вам, что сейчас они будут мериться по бесконечности и поэтому ваше приложение будет висеть минут 5, а вы будете думать, почему же у меня такой плохой перфоманс. Для того, чтобы проверить мои слова, берете тот же ваш сампл, и заменяете наш грид на стандартный, задаете ему ItemsSource размером в несколько десятков/сотен тысяч айтемов и запускаете. Когда ваше приложение очухается, запускаете снуп и смотрите количество визуальных строк, которые создал грид, вы увидите все ваши десятки тысяч строк, которые создавались все эти минуты. А после можете подумать еще раз, каким образом контрол может сказать, сколько места ему надо не просчитавшись полностью. Далее вам стоит подумать, что вам больше нравится, один информационный эксепшен от контрола, сообщающий что ему в какой-то момент пришла бесконечность на межуре, либо 5-10 минут зависания в этом месте из-за молчаливого создавания всех строк? Если вы действительно попробуете то, что я здесь описал, то увидите, что и мы и стандартные контролы работаем одинаково, и, если вам не нравится наше оповещение, то вы его можете спокойно отключить, и больше вы его не увидите, только пометьте на будущее себе, что в этом месте приложение может тормозить при больших ItemsSource для грида. Ну и еще, заметив, что мы работаем идентично со стандартным гридом, думаю вы сами поймете, что это не нам надо читать про Measure и Arrange.
Пожалуй я еще раз поясню, этот ексепшен это просто информирование разработчика о том, что в его приложении произошла такая ситуация, при которой не только наш грид, но и любой другой будет создавать все строки и в приложении это может вызвать потенциальные проблемы с производительностью. Мне кажется это более верное решение, чем просто молча создавать все строки несколько минут, как это делает, например, стандартный грид.