2011-06-01 88 views
2

我有一个DoubleAnimation,我想绑定它的From,To和Duration属性,以便它们能够平滑地更改。在Silverlight中绑定动画的持续时间属性

From和To的绑定效果很好,可以平滑地改变它们,但Duration的变化只是被忽略。

为了调试,我做了一个按钮,点击后调用包含StoryBoard的Stop和Begin方法,动画从正确的持续时间开始。此外,我检查并看到动画的Duration属性实际上每次都在更新,所以更改只会被动画忽略。 (不像从和到真正反应顺利进行。)

试图在WPF相同的,并得到了相同的结果,这里有一个片段:

 <Canvas> 
     <Canvas.Triggers> 
      <EventTrigger RoutedEvent="Canvas.Loaded"> 
       <BeginStoryboard> 
        <Storyboard x:Name="Story"> 
         <DoubleAnimation x:Name="Anime" 
             Duration="{Binding Duration}" 
             RepeatBehavior="Forever" 
             Storyboard.TargetName="Text1" 
             Storyboard.TargetProperty="(Canvas.Left)"            
             From="0" 
             To="400"            
             /> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Canvas.Triggers> 
     <TextBlock Text="Hello" Name="Text1"/> 
    </Canvas> 

我会很感激的解释为什么不是这个工作以及任何可以使绑定工作顺利进行的解决方法。

此外,我的实际最终目标是让TextBlock以恒定速度移动,而不管From和To中的更改。所以如果有另一种方法来实现这一点,它会更好。

谢谢。

回答

1

有两个问题:你的绑定源代码(ViewModel)是如何写入的,你是否更新了你的datacontext。这是我的代码,它的工作原理。

MainPage.xaml中:

<Canvas> 
    <Canvas.Triggers> 
     <EventTrigger RoutedEvent="Canvas.Loaded"> 
      <BeginStoryboard> 
       <Storyboard x:Name="Story"> 
        <DoubleAnimation x:Name="Anime" 
            Duration="{Binding}" 
            RepeatBehavior="Forever" 
            Storyboard.TargetName="Text1" 
            Storyboard.TargetProperty="(Canvas.Left)"            
            From="0" 
            To="400"            
            /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Canvas.Triggers> 
    <TextBlock Text="Hello" Name="Text1"/> 
    <Button Content="Change" Margin="0, 100, 0, 0" Click="Button_Click" /> 
</Canvas> 

MainPage.xaml.cs中:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.ComponentModel; 

namespace SilverlightApplication 
{ 
    public partial class MainPage : UserControl 
    { 
     AnimVM vm = new AnimVM(); 
     double dur = 5; 

     public MainPage() 
     { 
      InitializeComponent(); 

      vm.Duration = new Duration(TimeSpan.FromSeconds(dur)); 

      this.DataContext = vm.Duration; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      dur += 5; 
      vm.Duration = new Duration(TimeSpan.FromSeconds(dur)); 
      this.DataContext = vm.Duration; // don't forget this line 
     } 
    } 

    public class ViewModelBase : INotifyPropertyChanged, IDisposable 
    { 
     protected ViewModelBase() 
     { 
     } 

     protected virtual bool ThrowOnInvalidPropertyName { get; private set; } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      //this.VerifyPropertyName(propertyName); 

      PropertyChangedEventHandler handler = this.PropertyChanged; 
      if (handler != null) 
      { 
       var e = new PropertyChangedEventArgs(propertyName); 
       handler(this, e); 
      } 
     } 

     public void Dispose() 
     { 
      this.OnDispose(); 
     } 

     protected virtual void OnDispose() 
     { 
     } 
    } 

    public class AnimVM : ViewModelBase 
    { 
     private Duration _duration = new Duration(TimeSpan.FromSeconds(5)); 
     public Duration Duration 
     { 
      get { return _duration; } 
      set 
      { 
       if (object.ReferenceEquals(this._duration, value)) return; 

       this._duration = value; 
       base.OnPropertyChanged("Duration"); 
      } 
     } 
    } 
} 
+0

0123像是我说的,就我所关心的,绑定工程,我改变了我的视图模型中的持续时间,并且动画的持续时间属性每次都立即更新,这只是我需要调用StoryBoard.Stop ,StoryBoard.Begin,让动画真正改变。你能告诉我你的XAML吗? – Evgeny 2011-06-02 03:19:35

+0

这里是xaml和.cs,你可以点击按钮来改变持续时间。 – demaxSH 2011-06-02 07:25:08

0

我知道我的方式迟到了,但问题在于持续时间不是一个DependencyProperty,所​​以WPF没有听取值更改事件,因此不是在值更改时对动画进行更新 - 这与将更新后的值存储在对象中不同。