Может привести пример, когда следует использовать UIElement.UpdateLayout()?

Я читал об этом методе UpdateLayout() в MSDN.

В нем говорится:

Обеспечивает, чтобы все визуальные дочерние элементы этого элемента были правильно обновлено для макета.

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

Я работаю с Silverlight/WPF более года, но я до сих пор не использовал этот метод один раз.

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

Ответ 1

Возможно, вы захотите назвать это, если вам нужен элемент управления для немедленного завершения его компоновки, чтобы вы могли сделать что-то на этом основании. Например, вы можете вызвать UpdateLayout в дочернем элементе управления, чтобы он получил ActualHeight и ActualWidth, если вы хотите сделать что-то другое на основе этого (например, поместите его или нарисуйте что-то с соответствующим размером).

Ответ 2

Из моих исследований UpdateLayout представляется очень сильным способом получить все элементы управления макета для обновления. Однако в большинстве случаев система компоновки достаточно умна и достаточно быстра, чтобы обновлять ее самостоятельно. Все, что я прочитал, приводит меня к мысли, что этот вызов необходим только в том случае, если вы выполняете большую модификацию макета (добавляете элементы управления и перемещаете их), и вам нужен один конкретный сценарий компоновки, который будет отображаться, в то время как остальная часть стека обновлений (однако мне все еще предстоит увидеть хороший пример, чтобы показать это... нормальный алгоритм компоновки, кажется, так хорош). Эта статья MSDN в макете должна помочь прояснить ситуацию.

Однако из вышесказанного:

Метод UpdateLayout заставляет рекурсивное обновление макета и часто не требуется

и эта документация

Частые вызовы InvalidateArrange или, в частности, UpdateLayout, имеют значительные последствия для производительности, если большое количество элементов существуют в пользовательском интерфейсе. Избегайте вызова этого метода, если вы не требуют точного состояния компоновки для последующих вызовов других API-интерфейсов в ваш код.

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

Ответ 3

Я думаю, что наиболее часто используется при создании элементов управления. Например: если в коде вы чувствуете, что добавлен новый элемент управления или что-то в этом роде, вы можете вызвать этот UpdateLayout(), чтобы принудительно перенастроить элементы управления. В некоторых случаях WPF может считать, что пользовательский интерфейс изменяется настолько, что он сам вызывает ваш контроль UpdateLayout(). Мы все ошибаемся... если вы обнаружили элемент управления, который должен "перерисовать" или "изменить порядок" своих детей, вы можете попытаться заставить его "обновить", вызвав его "UpdateLayout".