2010-10-10 134 views
1

我一直在为此奋斗了好几个小时,我找不到我做错了什么。请帮我找到我的错误。我无法为WPF中的自定义属性设置动画

我用一个自定义依赖项属性创建了一个用户控件,我想为此属性设置动画。

这里是我的类:

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public long Val 
    { 
     get { return (long)GetValue(ValProperty); } 
     set { 
      SetValue(ValProperty, value); 

      // Update a text block for debug 
      ((Class1)this.Resources["class1"]).Val = value; 
     } 
    } 

    public static readonly DependencyProperty ValProperty = 
     DependencyProperty.Register("Val", typeof(long), typeof(UserControl1), new UIPropertyMetadata(0L)); 
} 

这里是一个应该制作动画(有一个名为usercontrol11的UserControl1的实例)的代码:

 Int64Animation myAnimation = new Int64Animation(); 
     myAnimation.From = 100; 
     myAnimation.To = 200; 
     myAnimation.Duration = new Duration(TimeSpan.FromSeconds(1)); 

     Storyboard.SetTargetName(myAnimation, userControl11.Name); 
     Storyboard.SetTargetProperty(myAnimation, new PropertyPath(UserControl1.ValProperty)); 

     Storyboard myStoryboard = new Storyboard(); 
     myStoryboard.Children.Add(myAnimation); 
     myStoryboard.Begin(this); 

我也尝试了XAML的做法,但它也不起作用(在以下XAML中,宽度动画可以正常工作,但Val不会):

<my:UserControl1 HorizontalAlignment="Left" Width="150" Margin="72,45,0,0" x:Name="userControl11" VerticalAlignment="Top" Background="#FFFFD100"> 
    <my:UserControl1.Triggers> 
    <EventTrigger RoutedEvent="MouseEnter"> 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <Int64Animation To="300" Duration="0:0:1" 
            Storyboard.TargetProperty="Val" /> 
        <DoubleAnimation To="300" Duration="0:0:1" 
            Storyboard.TargetProperty="Width" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
    </EventTrigger>       
    </my:UserControl1.Triggers> 
</my:UserControl1> 

任何帮助将不胜感激!

回答

3

嗯,它实际上是动画。你只是在错误的地方检查,动画不会调用Val属性设置访问器。例如,您可以覆盖OnPropertyChanged方法以查看更改:

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     base.OnPropertyChanged(e); 
     if(e.Property == ValProperty) 
     { 
      MessageBox.Show(e.NewValue.ToString()); 
     } 
    } 
+0

哇,非常感谢您的工作! 但是它为什么这样工作?对我来说这似乎很奇怪。我认为动画的重点是要改变属性的值...如何调用OnPropertyChanged,但该值不会自动更改? – 2010-10-10 05:43:10