Как я могу вручную указать нарисованный владельцем элемент управления WPF для обновления / перерисовки без выполнения измерения или организации проходов?

Мы делаем пользовательский рисунок в подклассе управленияOnRender, Этот код чертежа основан на внешнем триггере и данных. Таким образом, всякий раз, когда срабатывает триггер, нам необходимо повторно визуализировать элемент управления на основе этих данных. То, что мы пытаемся сделать, - это выяснить, как принудительно перерисовать элемент управления, но без прохождения всего этапа макета.

Как указано выше, большинство ответов, которые я видел, вращаются вокруг аннулированияVisual который делает недействительным макет, который вынуждает новое измерение и устраивает проходы, что очень дорого, особенно для очень сложных визуальных деревьев, как у нас. Но опять же, макет делаетне изменить, как и VisualTree. Единственное, что делает, это внешние данные, которые отображаются по-разному. Таким образом, это чисто вопрос рендеринга.

Опять же, мы просто ищем простой способ сообщить элементу управления, что ему нужно выполнить повторноOnRender, Я видел один «взлом», в котором вы создаете новыйDependencyProperty и зарегистрируйте его в «AffectsRender», для которого вы просто устанавливаете какое-то значение, когда хотите обновить элемент управления, но меня больше интересует, что происходит внутри реализации по умолчанию для этих свойств: что они вызывают, чтобы повлиять на это поведение.

Обновить:

Ну, похоже, такого вызова нет, дажеAffectsRender flag по-прежнему вызывает внутреннее прохождение Arrange (согласно ответу CodeNaked ниже), но я опубликовал второй ответ, который показывает встроенное поведение, а также обходной путь, чтобы подавить выполнение кода прохода макета с простым обнуляемым размером, как флаг. Смотри ниже.

Ответы на вопрос(4)

Ваш ответ на вопрос