WPF - выполняет цветную анимацию на основе предыдущего и текущего значения TextBlock - PullRequest
1 голос
/ 25 февраля 2010

Мне нужно изменить цвет TextBlock, чтобы указать, является ли число положительным или отрицательным - красный для отрицательного, синий для положительного. Я сделал это с помощью DataTrigger и конвертера, который возвращает True / False, является ли число отрицательным / положительным. Следующее требование немного сложнее: когда число изменяется, выполните медленное затухание, чтобы указать, увеличилось или уменьшилось число по сравнению с предыдущим значением, а затем оно постепенно исчезает в зависимости от того, какой цвет указывает его текущее положение, как указано выше.

Какой самый простой способ сделать это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2010

Я не думаю, что подход с Trigger.EnterAction будет работать. Чтобы применить новую анимацию, вам нужно будет указать Trigger.ExitAction, который удалит текущую анимацию, и в результате цвет вернется к значению по умолчанию. Когда вы затем запустите новую анимацию, она будет анимироваться от своего цвета по умолчанию (который теперь стал текущим цветом) к новому цвету. Привязка анимации От значения к некоторому динамическому значению не работает, потому что функция Freezable. Я решил эту проблему, введя прикрепленное свойство, генерирующее анимацию на лету из любого цвета, который объект в данный момент имеет, к указанному:

<TextBlock Text="text">
    <local:AnimationHelper.Animation>
        <local:ConstantColorAnimation 
            TargetProperty="Foreground" 
            To="{Binding CurrentState, Converter={StaticResource stateToColor}}" 
            Speed="1.5" /> 
    </local:AnimationHelper.Animation>
</TextBlock Text="text">

Это будет анимировать передний план TextBlock всякий раз, когда свойство CurrentState изменяется на новый цвет, который возвращается StateToColorConverter. Это из DataTemplate для ViewModel, который имеет свойство CurrentState. Если вы хотите, чтобы он связывался непосредственно с текстом, вам нужно написать TextToColorConverter.

Вот пример соответствующего кода для анимации ConstantColor:

private void CreateAnimation()
{
    if (this.ResolvedTargetProperty == null)
    {
        return;
    }
    var from = (Color)this.Context.GetValue(this.ResolvedTargetProperty);
    this.RemoveAnimation(this.ResolvedTargetProperty);
    if (this.Speed == 0)
    {
        this.Context.SetValue(this.ResolvedTargetProperty, from);
        return;
    }
    if (this.Speed < 0)
    {
        this.Context.SetValue(this.ResolvedTargetProperty, this.To);
        return;
    }
    var a = new ColorAnimation(
        from, this.To, new Duration(TimeSpan.FromSeconds(Math.Abs(this.To - from) / this.Speed)));
    this.Context.BeginAnimation(this.ResolvedTargetProperty, a);
}

Вместо того, чтобы делать все самостоятельно, вы также можете использовать Behavior Framework от Silverlight. AFAIK полностью совместим с WPF и вы можете использовать сборку напрямую. Вы могли бы даже найти поведение , которое уже делает то, что вам нужно.

0 голосов
/ 25 февраля 2010

Подход с триггерами правильный, и для запуска анимации вы можете использовать Trigger.EnterAction .

...