Ошибочный Цикл расположения “Silverlight Обнаруженное Расположение не мог завершиться” при использовании пользовательского элемента управления

Для объектов неизменяемых значений, таких как int, строки или даты, идентификация объекта не особенно полезна. Лучше думать о равенстве. Идентификация - это, по сути, деталь реализации объектов значения - поскольку они неизменяемы, нет эффективной разницы между наличием нескольких ссылок на один и тот же объект или несколько объектов.

14
задан Matthew Timbs 11 March 2009 в 20:52
поделиться

2 ответа

Существует хорошее сообщение в блоге на этой ошибке здесь .

Bascially, что может произойти, Вы изменяете некоторый размер в MeasureOverride где-нибудь, который вызывает другую меру, которая изменяет размер, который вызывает меру и так далее. Я столкнулся с этим однажды и зафиксировал его путем удаления любого кода, который вызвал обновление расположения или инициировал обновление расположения во время цикла расположения.

Обновление: Так как сообщения в блоге не стало, заключив его в кавычки здесь полностью:

Продолжение моей серии глюков для Silverlight 2, я хотел говорить о распространенной ошибке, которую видят люди. Эта ошибка является чем-то новым, которое Вы могли бы видеть при перемещении кода от Беты 2 до Предвыпускной версии или позже. В бете 2, если механизм расположения обнаружил цикл, он не бросил ошибок; насколько я понимаю расположение было просто прервано. Но с сообщением биты Beta2, брошена ошибка.

ошибка, которую Вы получите, определит "Цикл Расположения, Обнаруженный" как сообщение. Это сообщение об ошибке очень точно - механизм расположения обнаружил цикл в рамках Вашего расположения; или другой способ сказать это, у Вас есть бесконечный цикл в Вашем расположении.

крупнейший преступник, который приводит к этой ошибке, является кодом в обработчике событий LayoutUpdated. Если Ваш обработчик событий LayoutUpdated сделает что-нибудь для изменения расположения управления, то это заставит событие LayoutUpdated стрелять снова, и снова, и снова...:-)

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

Первый, необходимо рассмотреть, нужны ли Вам действительно изменения макета для появления на каждом вызове с LayoutUpdated. Это было бы достаточно для обработки события Loaded, а также Приложения. Текущий. Хост. Содержание. Событие Resized. Между этими двумя событиями Вы будете уведомлены, когда управление будет загружено в визуальное дерево, и Вы будете уведомлены любое время, хост изменен, который мог заставить Вас должны изменять свое расположение снова. Сценарии как модальные диалоговые окна должны попасть в эту категорию.

1111-секундный, если действительно необходимо использовать LayoutUpdated, Вы, возможно, просто должны были бы поместить некоторые условия вокруг своих изменений макета. Например, при вычислении новой ширины и высоты для управления перед фактической установкой ширины и высоты проверьте, чтобы удостовериться, что текущие значения отличаются от того, что Вы вычислили. Это позволит первому событию LayoutUpdated изменять размеры Вашего управления, которое инициировало другое событие LayoutUpdated, но то событие распознает, что нет никакой работы, чтобы сделать, и цикл закончится.

Эти те же правила будут применяться при обработке события SizeChanged, или если Вы делаете какие-либо другие переопределения на расположении Вашего управления.

7
ответ дан 1 December 2019 в 13:34
поделиться

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

6
ответ дан 1 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: