Анимированные области WPF (анимированные представления коллекций)

ОБНОВЛЕНИЕ. Теперь та же функциональность доступна вне области с использованием пакета SDK для Blend 3 посредством FluidMoveBehavior. Просто перетащите это поведение в область контейнера и установите свойства Duration и AppliesTo! Единственное различие в том, что функции для реалистичной анимации пока не поддерживаются в WPF. Будем ждать выпуска WPF 4.

Прошлым вечером я окончательно долгожданную (для меня!) функцию в Scrum Sprint Monitor: анимированные области WPF. Поскольку члены группы в Sprint перемещаются по списку (ObservableCollection<>),, добавляя или удаляя элементы, я всегда хотел, чтобы изменение было анимированным. Впрочем, мой текущий уровень понимания механизма макета WPF был недостаточен, чтобы выполнить эту задачу за несколько часов.

Наконец я нашел публикацию в блоге, которая указала мне правильный путь, в блоге Эда Фокса (Ed Foh). В свою очередь Эд основывался на наборе приемов WPF Кевина Мура (Kevin Moore), в который также входит область анимированной мозаики.

Это видеофайл, демонстрирующий улучшенное поведение моей анимированной универсальной сетки:

Анимированная универсальная сетка в действии

Почему эти два решения для меня не срабатывают

Оба вышеупомянутых решения содержат аппаратную логику позиционирования. Мне просто было нужно добавить анимационное поведение в StackPanel, WrapPanel и UniformGrid, а не в полностью настраиваемую область. Идеальным решением было бы поведение, которое можно было бы добавлять вверху этих контейнеров. Этот частный аспект не был реализован, и я закончил производными классами для каждой из этих областей, добавив к этим новым классам префикс "Animated". Это вполне приемлемое решение. ОБНОВЛЕНИЕ. В конечном итоге я пришел к выводу, что это был тот же подход, принятый по крайней мере одним коммерческим предложением.

Далее приводится код, необходимый для установки универсальной сетки (обратите внимание, что нужно просто указать перед классом панели префикс Wpf:Animated).

<ItemsControl ItemsSource="{Binding TeamMembersIncludingUnassigned}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
         <Wpf:AnimatedUniformGrid Duration="00:00:01" />
      </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
</ItemsControl>

Добавление анимации в существующий класс элемента управления Panel

Рабочий процесс для преобразования существующего элемента управления Panel в AnimatedPanel весьма прост.

  1. Произвести новый класс из нужного класса Panel (добавив префикс Animated).
  2. Переопределить метод ArrangeOverride в новом классе (не вызывая реализацию базового класса).
  3. С помощью .NET Reflector извлечь содержимое метода ArrangeOverride из этой реализации базового класса и просто подставить вызов element.Arrange, который выполняется для каждого дочернего объекта при вызове статического метода AnimatedPanelHelper.ArrangeChild().

Это все, что необходимо сделать!

Благодарности

Спасибо Эду Фоксу (Ed Foh) и Кевину Муру (Kevin Moore) за их отличную работу.