###やりたいこと
WPFでStoryBoardに設定したアニメーションを再生し、アニメーションの再生がすべて完了した後に別の処理を開始したいです。
例として以下のサンプルプログラムを用意しました。
このサンプルでは画面の背景色がゆっくりと変わるアニメーションを設定したStoryBoardを呼び出した箇所の後に、画面に表示する文字を「再生終了」に変更する処理を入れています。
ただこのままでは当然、アニメーションが開始した直後(再生が終了するよりも前)に画面に「再生終了」の文字が表示されます。
アニメーションの再生が完了することを待って、上記処理を呼び出すことはできるでしょうか。
C#
1using System.ComponentModel; 2using System.Windows; 3using System.Windows.Media.Animation; 4 5namespace GreetingApp 6{ 7 public enum Period { MORNING, EVENING, NIGHT }; 8 9 public partial class MainWindow : Window 10 { 11 private readonly GreetingPhrase ph = new GreetingPhrase(); 12 13 public MainWindow() 14 { 15 InitializeComponent(); 16 DataContext = ph; 17 } 18 19 //ph.Nowに時間帯をセットする。 20 private void Click_Morning(object sender, RoutedEventArgs e) => ph.Now = Period.MORNING; 21 22 private void Click_Evening(object sender, RoutedEventArgs e) => ph.Now = Period.EVENING; 23 24 private void Click_Night(object sender, RoutedEventArgs e) => ph.Now = Period.NIGHT; 25 26 //「あいさつ」ボタン押下時の処理 27 private void Click_Greeting(object sender, RoutedEventArgs e) 28 { 29 ph.ChangePhrase(); 30 31 //ボタンを押してNowにセットした時間帯に合わせたアニメーションを再生する。 32 switch (ph.Now) 33 { 34 case Period.MORNING: 35 var sb = FindResource("MorningAnimation") as Storyboard; 36 BeginStoryboard(sb); 37 break; 38 39 case Period.EVENING: 40 sb = FindResource("EveningAnimation") as Storyboard; 41 BeginStoryboard(sb); 42 break; 43 44 case Period.NIGHT: 45 sb = FindResource("NightAnimation") as Storyboard; 46 BeginStoryboard(sb); 47 break; 48 } 49 //上記アニメーションの再生が完了するのを待って何らかの処理を開始したい。 50 //例としてPhraseを変更する処理を入れる。 51 ph.ChangePhraseAfterAnimation(); 52 } 53 } 54 55 public class GreetingPhrase : INotifyPropertyChanged 56 { 57 public string Phrase { get; set; } 58 59 private Period _Now; 60 public Period Now 61 { 62 get => _Now; 63 set 64 { 65 _Now = value; 66 RaiseProeprtyChanged(nameof(Now)); 67 } 68 } 69 70 public void ChangePhrase() 71 { 72 switch (Now) 73 { 74 case Period.MORNING: 75 Phrase = "おはよう!"; 76 break; 77 case Period.EVENING: 78 Phrase = "こんにちは!"; 79 break; 80 case Period.NIGHT: 81 Phrase = "こんばんは!"; 82 break; 83 } 84 RaiseProeprtyChanged(nameof(Phrase)); 85 } 86 87 public void ChangePhraseAfterAnimation() 88 { 89 Phrase = "再生終了"; 90 RaiseProeprtyChanged(nameof(Phrase)); 91 } 92 93 #region INotifyPropertyChanged の実装 94 public event PropertyChangedEventHandler PropertyChanged; 95 private void RaiseProeprtyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 96 #endregion 97 } 98}
xaml
1<Window 2 x:Class="GreetingApp.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 x:Name="window" 6 Title="MainWindow" 7 Width="450" 8 Height="450"> 9 10 <Window.Resources> 11 <Storyboard x:Key="MorningAnimation"> 12 <ColorAnimationUsingKeyFrames Storyboard.TargetName="window" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 13 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FFFFA400" /> 14 </ColorAnimationUsingKeyFrames> 15 </Storyboard> 16 <Storyboard x:Key="EveningAnimation"> 17 <ColorAnimationUsingKeyFrames Storyboard.TargetName="window" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 18 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FF0388FF" /> 19 </ColorAnimationUsingKeyFrames> 20 </Storyboard> 21 <Storyboard x:Key="NightAnimation"> 22 <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 23 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FF02067A" /> 24 </ColorAnimationUsingKeyFrames> 25 </Storyboard> 26 <Style TargetType="{x:Type Button}"> 27 <Setter Property="Width" Value="100" /> 28 <Setter Property="Height" Value="50" /> 29 <Setter Property="FontSize" Value="24" /> 30 </Style> 31 </Window.Resources> 32 33 <Canvas> 34 <TextBlock 35 Canvas.Left="111" 36 Canvas.Top="98" 37 Width="219" 38 Height="100" 39 FontSize="36" 40 Text="{Binding Path=Phrase}" 41 TextWrapping="Wrap" /> 42 <Button 43 Canvas.Left="30" 44 Canvas.Top="250" 45 Click="Click_Morning" 46 Content="朝" /> 47 <Button 48 Canvas.Left="170" 49 Canvas.Top="250" 50 Click="Click_Evening" 51 Content="昼"/> 52 <Button 53 Canvas.Left="310" 54 Canvas.Top="250" 55 Click="Click_Night" 56 Content="夜" /> 57 <Button 58 Canvas.Left="170" 59 Canvas.Top="325" 60 Click="Click_Greeting" 61 Content="あいさつ" /> 62 </Canvas> 63</Window>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/26 02:37