2016-01-22 36 views
12

我想动画ButtonBackground如果鼠标超过Button用户控件动画按钮的背景

ButtonBackground必然会我在代码中创建的我UserControl

... Background="{Binding BGColor, Elementname="QButton"}" 

现在后面的自定义依赖属性,如果我尝试使用

<Trigger Property="IsMouseOver" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation To="LightBlue" 
           Duration="0:0:2" 
           Storyboard.TargetProperty="Background.Color"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </Trigger.EnterActions> 
</Trigger> 
动画按钮的背景

我得到一个例外,说:

不能生气一个不可变属性(或类似)。

我该如何解决这个问题?

+0

这些[http://blogs.msdn.com/b/mikehillberg/archive/2006/09/26/cannotanimateimmutableobjectinstance.aspx](http://blogs.msdn.com/b/mikehillberg/archive /2006/09/26/cannotanimateimmutableobjectinstance.aspx)可能会帮助[http://stackoverflow.com/questions/14383214/wpf-storyboard-in-style-returning-a-cannot-animate-color-on-an-immutable- OBJ](http://stackoverflow.com/questions/14383214/wpf-storyboard-in-style-returning-a-cannot-animate-color-on-an-immutable-obj) – spaceplane

回答

3

基于迈克Hillberg的大文章约Cannot animate '...' on an immutable object instance

作为一种变通方法,您可以更新绑定,使刷副本的 Button。这不会影响绑定 - 任何对 窗口前景的更改都会传播到Button,但 Button将为本地动画制作自己的副本。

所以对于你的完整的解决方案应该是这样的:

<Window x:Class="WpfApplication2.Window3" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:local="clr-namespace:WpfApplication1" 
    .... 
    .... 

Background="{Binding BGColor, Converter={x:Static local:MyCloneConverter.Instance}}" 

这是引用一个IValueConverter的结合,看起来像这样:

class MyCloneConverter : IValueConverter 
{ 
    public static MyCloneConverter Instance = new MyCloneConverter(); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is Freezable) 
     { 
      value = (value as Freezable).Clone(); 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 
0

更改DP(BGCOLOR)本身来改变背景。

<Button.Triggers> 
    <EventTrigger RoutedEvent="MouseEnter"> 
     <BeginStoryboard> 
      <Storyboard> 
       <ColorAnimation To="Red" 
         Duration="0:0:2" 
         Storyboard.TargetName="QButton" 
         Storyboard.TargetProperty="(BGColor).(SolidColorBrush.Color)"/> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Button.Triggers>