2016-01-22 30 views
12

Chciałbym animować Button 's Background, jeśli mysz znajduje się nad Button.UserControl Animuj tło przycisku

Button „s Background jest zobowiązany do właściwości niestandardowe zależność Utworzyłem w Kodeksie Za mojego UserControl

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

Teraz gdy próbuję animowanie tło przycisku, korzystając

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

Otrzymuję wyjątek, który mówi:

can not anima niezmienną własność (lub podobną).

Jak rozwiązać ten problem?

+0

Te [http://blogs.msdn.com/b/mikehillberg/archive/2006/09/26/cannotanimateimmutableobjectinstance.aspx](http://blogs.msdn.com/b/mikehillberg/archive /2006/09/26/cannotanimateimmutableobjectinstance.aspx) może pomóc [http://stackoverflow.com/questions/14383214/wpf-storyboard-in-style-reading-a-kanurek-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

Odpowiedz

3

podstawie wielkim artykule Mike Hillberg jest o Cannot animate '...' on an immutable object instance:

Jako obejście, można zaktualizować wiązanie zrobić kopię szczotki do Button. Nie przeszkadza to wiązaniu - każda zmiana na pierwszym planie okna będzie nadal propagowana do Button - ale Button stworzy własną kopię dla lokalnej animacji.

Tak kompletne rozwiązanie dla twoich powinno być tak:

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

które odwołuje się IValueConverter do wiązania, które wygląda następująco:

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

Zmiana DP (bgcolor) sam zmienić tło.

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