Я добавлял немного анимации к своему приложению WPF.
Благодаря уникальному решению Dan Crevier анимации детей панели, объединенной с потрясающим WPF Penner анимации, это оказалось довольно простым, чтобы заставить одни из моих средств управления выглядеть большими и сделать, чтобы его дети переместились с некоторой хорошей анимацией.
К сожалению, это все идет с производительностью наверху. Я рад поразить производительность, когда объекты добавляются/удаляются, или управление изменено, но кажется, что этот перфект совершил нападки, последовательно происходит в течение времени жизни приложения, даже когда объекты абсолютно статичны.
PanelLayoutAnimator
класс использует приложенное свойство для сцепления UIElement.LayoutUpdated
событие. Когда это событие стреляет, преобразования рендеринга анимированы, чтобы заставить детей скользить к их новым позициям.
К сожалению, кажется что LayoutUpdated
событие стреляет каждую приблизительно секунду, даже когда ничего не происходит в приложении (по крайней мере, я не думаю выполнение своего кода ничего - приложение не фокусируется, и мышь устойчива.), Поскольку причина события не сразу очевидна для обработчика событий, все дети управления должны быть переоценены. Об этом событии называют однажды секунде, когда неактивный. Частота увеличивается на самом деле с помощью приложения.
Таким образом, мой вопрос, как я могу улучшить производительность здесь? Любой ответ, который помогает, ценился бы, но я в настоящее время застреваю на этих дополнительных вопросах:
Что вызывает LayoutUpdated
событие для увольнения так часто? Это, как предполагается, происходит, и в противном случае как я могу узнать, почему это стреляет, и сократите его?
Существует ли более удобный способ в обработчике, чтобы знать, произошло ли что-то, который, возможно, переместил детей? Если так, я мог прыгнуть с парашютом рано и избежать издержек цикличного выполнения каждый ребенок.
На данный момент я буду работать вокруг этой проблемы путем отключения анимации, когда будут больше, чем дети N в панели.