2017-11-14 29 views
-1

WPFでは、はStoryboard.SkipToFill()で停止できますが、Completedイベントは直ちに発生しません。ただ、次のデモコード示すよう:WPF Storyboard.Completedイベントは即時ではありません。

public partial class MainWindow : Window 
{ 
    private Storyboard _storyboard = new Storyboard(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InitializeStoryboard(); 
    } 

    private void InitializeStoryboard() 
    { 
     var animation = new DoubleAnimation 
     { 
      Duration = TimeSpan.FromSeconds(3), 
      From = 0, 
      To = 300 
     }; 

     Storyboard.SetTarget(animation, MyRectangle); 
     Storyboard.SetTargetProperty(animation, new PropertyPath(WidthProperty)); 

     _storyboard = new Storyboard(); 
     _storyboard.Children.Add(animation); 

     _storyboard.Completed += StoryboardOnCompleted; 
    } 

    private void StartButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     _storyboard.Begin(this, true); 
    } 

    private void StopButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     _storyboard.SkipToFill(this); 
     Debug.WriteLine(@"SkipToFill"); 
    } 

    private void StoryboardOnCompleted(object sender, EventArgs eventArgs) 
    { 
     Debug.WriteLine(@"Completed"); 
    } 
} 

Storyboardを開始し、その後、それを停止するStopButtonをクリックしStartButtonをクリックします。出力されます:だから

を完了

  • SkipToFill
  • は、私の質問:Completedイベントにする方法は、直ちに解雇しましたか?すなわち、出力することができるようにするには:

      SkipToFill
    • 完成
+0

これは可能ではないようです。なぜあなたはそのような行動を必要としますか? – Clemens

+0

デザインに関しては問題です。 'Storyboard'は、' Start'メソッドと 'Stop'メソッドを公開する' MyPlayer'という名前のクラスにラップされています。 'Stop'メソッドを呼び出し、' Completed'イベントで更新された 'MyPlayer'の' Property'を取得したいと思います。実際には財産ではなく、そのようなものです。あなたは 'MyPlayer'のイベントが必要だと言うかもしれませんが、それは私が望むものではありません。 – Iron

答えて

-1

SkipToFill方法スケジュールアニメーションの終わり。レンダラーが動くのを待つことができると思います。私はとにかくそれが動作することを疑う、しかし:

_storyboard.SkipToFill(this); 

Dispatcher.CurrentDispatcher.Invoke(
    new Action(delegate { }), DispatcherPriority.Background); 

Debug.WriteLine(@"SkipToFill"); 
+0

ここにあなたのための良いリンクがあります:https://meta.stackexchange.com/questions/135/encouraging-people-to-explain-downvotesとにかく、これは答えです。実際、最初の文は.NETソースコードで見つかりました。 – l33t

0

StoryboardCompletedイベントを発生させますが、それが発生したとき、あなたがイベントを処理することができたときにあなたがコントロールすることはできません。

したがって、Completedイベントに別のイベントハンドラを接続し、Completedイベントが発生した後に、何でもしても構いません。

イベントハンドラは、あなたがそれらを登録順に呼び出されます、つまりこれは、予想される順序で出力を印刷します:

private void StopButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    _storyboard.Completed += _storyboard_Completed; 
    _storyboard.SkipToFill(this); 
} 

private void _storyboard_Completed(object sender, EventArgs e) 
{ 
    Debug.WriteLine(@"SkipToFill"); 
    _storyboard.Completed -= _storyboard_Completed; 
} 

private void StoryboardOnCompleted(object sender, EventArgs eventArgs) 
{ 
    Debug.WriteLine(@"Completed"); 
} 

あなたが実際に(非同期)ブロックしたい場合はStopButton_OnClick方法になるまでCompletedが提起されました。SemaphoreSlim

private readonly System.Threading.SemaphoreSlim _semaphore = new System.Threading.SemaphoreSlim(0, 1); 
private async void StopButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    _storyboard.Completed += (ss, ee) => _semaphore.Release(); 
    _storyboard.SkipToFill(this); 
    await _semaphore.WaitAsync(); //wait here... 

    Debug.WriteLine(@"SkipToFill"); 

} 

private void StoryboardOnCompleted(object sender, EventArgs eventArgs) 
{ 
    Debug.WriteLine(@"Completed"); 
} 
関連する問題