質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

3776閲覧

[WPF]アニメーションの再生完了を待って別の処理を開始する方法

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/10/22 08:41

編集2020/10/22 08:42

###やりたいこと
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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

StoryboardにはCompletedイベントがあります。
Storyboard クラス (System.Windows.Media.Animation) | Microsoft Docs

cs

1private void Click_Greeting(object sender, RoutedEventArgs e) 2{ 3 ph.ChangePhrase(); 4 5 Storyboard sb; 6 switch(ph.Now) 7 { 8 case Period.MORNING: 9 sb = FindResource("MorningAnimation") as Storyboard; 10 break; 11 case Period.EVENING: 12 sb = FindResource("EveningAnimation") as Storyboard; 13 break; 14 default: 15 sb = FindResource("NightAnimation") as Storyboard; 16 break; 17 } 18 19 sb.Completed += Completed; 20 BeginStoryboard(sb); 21 22 void Completed(object _, EventArgs __) 23 { 24 sb.Completed -= Completed; 25 ph.ChangePhraseAfterAnimation(); 26 } 27}

Storyboardに組み込めるようなものなら、入れてしまってもよさそうですが。


もちろんxamlでイベントつけてもいいですよ。

xml

1<Storyboard x:Key="MorningAnimation" Completed="Storyboard_Completed"> 2 <ColorAnimationUsingKeyFrames Storyboard.TargetName="window" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 3 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FFFFA400" /> 4 </ColorAnimationUsingKeyFrames> 5</Storyboard> 6<Storyboard x:Key="EveningAnimation" Completed="Storyboard_Completed"> 7 <ColorAnimationUsingKeyFrames Storyboard.TargetName="window" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 8 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FF0388FF" /> 9 </ColorAnimationUsingKeyFrames> 10</Storyboard> 11<Storyboard x:Key="NightAnimation" Completed="Storyboard_Completed"> 12 <ColorAnimationUsingKeyFrames Storyboard.TargetName="window" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 13 <EasingColorKeyFrame KeyTime="0:0:1" Value="#FF02067A" /> 14 </ColorAnimationUsingKeyFrames> 15</Storyboard>

cs

1private void Click_Greeting(object sender, RoutedEventArgs e) 2{ 3 ph.ChangePhrase(); 4 5 switch(ph.Now) 6 { 7 case Period.MORNING: 8 var sb = FindResource("MorningAnimation") as Storyboard; 9 BeginStoryboard(sb); 10 break; 11 12 case Period.EVENING: 13 sb = FindResource("EveningAnimation") as Storyboard; 14 BeginStoryboard(sb); 15 break; 16 17 case Period.NIGHT: 18 sb = FindResource("NightAnimation") as Storyboard; 19 BeginStoryboard(sb); 20 break; 21 } 22} 23 24private void Storyboard_Completed(object sender, EventArgs e) 25{ 26 ph.ChangePhraseAfterAnimation(); 27}

投稿2020/10/22 11:47

編集2023/07/23 08:16
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/26 02:37

遅くなり申し訳ございません。 うまくいきました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問