WPF ColorAnimation, кажется, сохраняет часть оригинального цвета? - PullRequest
2 голосов
/ 16 июня 2010

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

У меня есть список элементов, связанных со списком.Эти элементы имеют свойство enum, которое может иметь одно из трех значений - 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, но установка его на «стоп» означала, что цвет вернется к исходному цвету, как только анимация завершится (как и ожидалось).

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

Спасибо всем

1 Ответ

3 голосов
/ 16 июня 2010

Вам необходимо установить 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>
...