2016-01-11 4 views
1

У меня есть прямоугольник в WPF, определенный таким образом;Анимация цвета прямоугольника при изменении свойства заливки

<Rectangle x:Name="redBrush" Width="20" Height="20" Fill="{Binding RectColor}" Stroke="Black" RadiusX="2" RadiusY="2"> 

Я хотел бы анимировать изменение цвета от одного к другому.

Я пытался что-то вроде этого:

<Rectangle x:Name="redBrush" Width="20" Height="20" Fill="{Binding NewColor}" Stroke="Black" RadiusX="2" RadiusY="2"> 
     <Rectangle.Triggers> 
      <EventTrigger RoutedEvent="Rectangle.MouseEnter"> 
       <BeginStoryboard> 
        <Storyboard> 
         <ColorAnimation Storyboard.TargetName="redBrush" 
         Storyboard.TargetProperty="(Rectangle.Fill).Color" To="{Binding NewColor}" Duration="0:0:3" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Rectangle.Triggers> 
    </Rectangle> 

Но у меня есть две проблемы с этим подходом. Какой RoutedEvent я должен использовать? и свойство To = в ColorAnimation не работает.

Не могли бы вы мне помочь? Спасибо

ответ

0

Раскадровка - это объекты, подлежащие замораживанию, вы не можете установить их свойства с помощью привязок.

Обходной будет генерировать раскадровки каждый раз, когда Fill DP изменяется:

private SolidColorBrush _rectColor; 
public SolidColorBrush RectColor { 

    get {return _rectColor;} 
    set { 
     _rectColor = value; 
     _sbFillAnimation= CreateFillAnimationStoryboard(_rectColor); 
     _sbFillAnimation.Begin(); 
    } 
} 

private Storyboard _sbFillAnimation; 

private Storyboard CreateFillAnimationStoryboard(SolidColorBrush rectColor) { 
    Storyboard sb = new Storyboard() { Duration = TimeSpan.FromSeconds(3), BeginTime = TimeSpan.Zero}; 

    ColorAnimation colAnim = new ColorAnimation(); 
    colAnim.From = rectColor.Color; 
    colAnim.To = Colors.Gray; 
    colAnim.Duration = new Duration(TimeSpan.FromSeconds(3)); 
    colAnim.AutoReverse = false; 

    sb.Children.Add(colAnim); 

    Storyboard.SetTarget(colAnim, redBrush); 
    Storyboard.SetTargetProperty(colAnim, new PropertyPath("Fill.Color")); 


    return sb; 
} 
+0

Спасибо за ваш ответ. Идея кажется действительно хорошей. У вас есть идея, почему я получил ошибку на Storyboard.SetTargetProperty (ca, новый PropertyPath («(Rectangle.Fill) .Color»)); ? «Невозможно разрешить все ссылки свойств в пути свойств» (Rectangle.Fill) .Color '. Убедитесь, что применимые объекты поддерживают свойства. " – Lorenzo522

+0

Ah ... вы обновляете еще раз фрагмент – Lorenzo522

+0

mhmm ... Это не работает для меня «Не удается разрешить все ссылки на свойства в пути свойств» (Rectangle.Fill) .Color '. Убедитесь, что применимые объекты поддерживают свойства «. – Lorenzo522

Смежные вопросы