Поведение присоединенного индикатора состояния занятости

Сегодня я решил инкапсулировать циклический индикатор выполнения, который я использую в Scrum Sprint Monitor, в многократное поведение. Это также послужит и для обучения опытом, поскольку я еще не имел шанса поэкспериментировать с присоединенным поведением. У меня были следующие требования.

  • Наличие поведения, при котором отображается анимация во время долго выполняющихся операций. Она должна затемнять заданную область в пользовательском интерфейсе, при желании предотвращая попытку ввода в этой области. Все переходы состояний должны быть анимированными.
  • Воздействие на логическое дерево должно быть минимальным.
  • Можно настраивать параметры, такие как кисть затемнения, продолжительность перехода и др.

Эта проблема оказалась идеальным кандидатом для создания поведения, и мне потребовалось всего лишь несколько часов, чтобы осуществить это. Здесь находится короткое демонстрационное видео:

Это поведение использует простой и превосходный элемент управления Circular Progress Bar от Саши Барбера (Sasha Barber) (см. CodeProject). Впрочем, если потребуется использовать другой элемент управления для анимации, его можно легко заменить.

Использование

Это поведение имеет простое требование — оно может быть присоединено только к элементу Grid (я надеюсь, что в большинстве проектов это требование будет легко удовлетворить). Единственное нужное свойство — BusyState, которое сообщает, когда поведение должно начать работать:

<Grid DataContext="{Binding Path=ConfigurationViewModel, Source={StaticResource serviceLocator}}"
      Behaviors:BusyIndicatorBehavior.BusyState="{Binding IsBusy}"
      Behaviors:BusyIndicatorBehavior.TargetVisual="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}}">

Это поведение работает путем добавления визуального дерева во время выполнения под присоединенным объектом зависимости DependencyObject (элементом Grid). Флаг состояния Busy подключается путем предоставления привязки в присоединенное свойство BusyState. Можно также использовать несколько других дополнительных свойств, например для настройки кисти затемнения, продолжительности перехода, полей и пр.

Исходный код можно загрузить из коллекции сообщества Microsoft Expression. Если имеются какие-либо предложения, или если вы просто нашли эту статью полезной, оставьте отклик.

Чтобы посмотреть на исходный код, использующий это поведение, пройдите на страницу проекта Scrum Sprint Monitor на сайте CodePlex и найдите объект Behaviors:BusyIndicatorBehavior.