2011-06-01 5 views
2

私は、From、To、およびDuration Propertiesをバインドしてスムーズに変更するDoubleAnimationを持っています。SilverlightでアニメーションのDurationプロパティをバインドする

FromとToのバインディングはうまく動作し、スムーズに変更されますが、Durationの変更は単に無視されます。

デバッグでは、クリックすると、StoryBoardを含むStopメソッドとBeginメソッドが呼び出され、アニメーションが最初から正しい持続時間で開始されました。また、アニメーションのDurationプロパティが実際に毎回更新されていることを確認して見ました。そのため、変更はアニメーションによって無視されています。

WPFで同じことをしようとしましたし、同じ結果を得た、ここに抜粋です(Fromとそれに本当にスムーズに反応するが、とは違って。):

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

私は説明がなぜこの作業ではない、本当に感謝バインディングをスムーズに行うための回避策があります。

また、私の実際の最終目標は、FromとToの変更にもかかわらず、TextBlockを一定の速度で動かすことです。だから、これを達成する別の方法があれば、それはさらに良いでしょう。

ありがとうございました。

答えて

1

2つの懸念事項があります。バインディングソース(ViewModel)がどのように書き込まれ、データコンテキストを更新したかです。ここに私のコードがあり、それは動作します。

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

私が心配している限り、バインディングの仕事は変わりました。私のビューモデルの期間とアニメーションの継続時間のプロパティは、毎回すぐに更新されました。StoryBoard.Stop 、StoryBoard.Begin、アニメーションを実際に変更します。あなたはあなたのXAMLを見せてくれますか? – Evgeny

+0

ここにxamlと.csがあります。ボタンをクリックして期間を変更することができます。 – demaxSH

0

私はパーティーへの道後半だけど、問題は、DurationはDependencyPropertyではないため、WPFは値の変更イベントをリッスンしていないため、値が変更されたときにアニメーションを解読する - これは、更新された値をオブジェクトに格納するだけとは異なります。

関連する問題