Кажется, что WPF ColorAnimation сохраняет часть исходного цвета?

У меня странная проблема с цветной анимацией.

У меня есть список элементов, привязанных к списку. Эти элементы имеют свойство перечисления, которое может иметь одно из трех значений - NoRemarks, RemarksFound и RemarksUpdated.

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

Вот XAML - я включил только необходимые части:

Прямоугольник:

<Rectangle x:Name="HeaderRemarkStatusRectangle" Grid.Column="1" Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Left"
        RadiusX="1" RadiusY="1" Width="10" Margin="3" StrokeThickness="1" >
    <Rectangle.Stroke>
      <SolidColorBrush Color="#FFDC5A5A" x:Name="RectangleStroke" />
    </Rectangle.Stroke>
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
        <GradientStop Color="#ff7a7a" Offset="0.5" x:Name="GradientStop1" />
        <GradientStop Color="#ff5653" Offset="0.5" x:Name="GradientStop2" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>

Триггеры:

  <DataTrigger Binding="{Binding Path=ItemStatus}" Value="RemarksUpdated">
    <DataTrigger.EnterActions>
      <BeginStoryboard>
        <BeginStoryboard.Storyboard>
          <Storyboard Duration="0:0:0.5" >
            <ColorAnimation Storyboard.TargetName="GradientStop1" Storyboard.TargetProperty="Color" To="#83ec71" />
            <ColorAnimation Storyboard.TargetName="GradientStop2" Storyboard.TargetProperty="Color" To="#5dda4e" />
            <ColorAnimation Storyboard.TargetName="RectangleStroke" Storyboard.TargetProperty="Color" To="#FF50AA46" />
          </Storyboard>
        </BeginStoryboard.Storyboard>
      </BeginStoryboard>
    </DataTrigger.EnterActions>
  </DataTrigger>
</DataTemplate.Triggers>

Я попробовал несколько вещей, чтобы исправить проблему ...

Я попытался настроить Datatrigger.exitactions для каждого триггера так, чтобы он возвращал цвет к белому (немного выдумка, но я хотел увидеть, не было ли проблемой отсутствующий раздел «От»). Когда сработала анимация, у меня получился полупрозрачный прямоугольник, хотя и подходящего цвета.

Я также попытался установить свойство «from» - опять же, это не совсем практично, поскольку я не знаю, каким будет исходный цвет для триггера, но я хотел увидеть эффект. Получил результат, аналогичный приведенному выше.

Также попытался изменить свойство FillBehaviour, но установка его на «стоп» означала, что цвет вернется к исходному цвету, как только анимация будет завершена (как и ожидалось).

Я думал, что анимация будет анимироваться из текущего цвета (либо из таблицы данных, либо из текущей анимации, если она существует), и будет анимироваться в новый цвет. Я не могу понять, почему у меня появляется цвет между исходным и новым цветом. Это известная проблема с цветной анимацией или проблема с моими триггерами?

Спасибо всем


person Chris Aldridge    schedule 16.06.2010    source источник


Ответы (1)


Вам необходимо установить Duration для объектов ColorAnimation. По умолчанию Продолжительность для Анимация длится 1 секунду, поэтому ваша 0,5-секундная раскадровка занимает только половину анимации.

<Storyboard>
    <ColorAnimation Storyboard.TargetName="GradientStop1" Storyboard.TargetProperty="Color" To="#83ec71" Duration="0:0:0.5"/>
    <ColorAnimation Storyboard.TargetName="GradientStop2" Storyboard.TargetProperty="Color" To="#5dda4e" Duration="0:0:0.5"/>
    <ColorAnimation Storyboard.TargetName="RectangleStroke" Storyboard.TargetProperty="Color" To="#FF50AA46" Duration="0:0:0.5"/>
</Storyboard>
person Quartermeister    schedule 16.06.2010
comment
Отлично, спасибо. Я пытался разобраться с этим несколько дней. Я предположил, что анимация будет просто использовать продолжительность из раскадровки. Еще раз спасибо - person Chris Aldridge; 16.06.2010
comment
Это меня так долго беспокоило. Я не могу поверить, что ColorAnimation не наследует свою продолжительность от раскадровки. Почему?! - person Kohanz; 25.02.2016