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

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

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

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


Обновление:

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

22
задан MarqueIV 16 June 2017 в 15:26
поделиться