2016-01-22 22 views
12

Fare, Button'un üzerindeyse, Button'un Background modelini canlandırmak istiyorum.UserControl Animate Button'ın Arka Planı

Button 'ın Background Ben Şimdi benim UserControl

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

Arkası Kanununda oluşturduğumuz özel bağımlılık özelliğine bağlı ben

<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> 
kullanarak Button arka planını canlandırmak çalışırsanız

Bir istisna alıyorum diyor ki:

anima yapamaz bir değişmez özellik (veya benzer).

Bu sorunu nasıl çözebilirim? Mike Hillberg 'ın büyük bir maddeye dayanarak

+0

Bunlar [http://blogs.msdn.com/b/mikehillberg/archive/2006/09/26/cannotanimateimmutableobjectinstance.aspx](http://blogs.msdn.com/b/mikehillberg/archive /2006/09/26/cannotanimateimmutableobjectinstance.aspx) yardımcı olabilir [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

cevap

3

yaklaşık Cannot animate '...' on an immutable object instance:

bir çözüm olarak, Button için fırçanın bir kopyasını yapmak için bağlayıcı güncelleyebilirsiniz. Bu, bağlamaya müdahale etmiyor - penceresinin ön planındaki herhangi bir değişiklik hala Button ürününe yayılacak - ancak Button yerel bir animasyon için kendi kopyasını oluşturacaktır.

Peki senin için komple bir çözüm böyle olmalı: bir IValueConverter başvuran

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

bu şuna benzer bağlayıcı:

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

Değişim DP (bgcolor) Arkaplanı değiştirmek için.

<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> 
İlgili konular