2016-01-22 29 views
12

Mi piacerebbe animare uno BackgroundButton se il mouse è su Button.UserControl Sfondo pulsante animato

s Background' è destinato a una proprietà di dipendenza personalizzato che ho creato nel codice dietro della mia UserControl

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

Ora, se provo ad animare lo sfondo del pulsante utilizzando

<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> 
Il Button

Ricevo un'eccezione che dice:

can not anima una proprietà immutabile (o simile).

Come posso risolvere questo problema?

+0

Questi [http://blogs.msdn.com/b/mikehillberg/archive/2006/09/26/cannotanimateimmutableobjectinstance.aspx](http://blogs.msdn.com/b/mikehillberg/archive /2006/09/26/cannotanimateimmutableobjectinstance.aspx) può aiutare [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

risposta

3

Sulla base grande articolo di Mike Hillberg 's su Cannot animate '...' on an immutable object instance:

Per risolvere il problema, è possibile aggiornare l'associazione per fare una copia del pennello per la Button. Ciò non interferisce con il binding: qualsiasi modifica al foreground della finestra verrà comunque propagata allo Button - ma lo Button creerà la propria copia per un'animazione locale.

Quindi la soluzione completa per la vostra dovrebbe essere simile a questo:

<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}}" 

che fa riferimento a un IValueConverter per il legame che assomiglia a questo:

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

Modificare il DP (BGColor) stesso per cambiare lo sfondo.

<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>