###やりたいこと
WPFでアニメーションをつける方法を調べています。
Blendを使えばボタンのクリックなどをトリガーとしてStoryBoardに記述したアニメーションを再生することは簡単にできそうです。
しかし、XAMLに記述したボタンのクリック等のトリガーではなく、コードビハインドで定義しているフラグや条件をトリガーとしてアニメーションを再生するかどうかを決定する方法はありますか?
例として、下のようなサンプルプログラムを作ってみました。
「朝」「昼」「夜」のボタンを押すとコードビハインドで変数nowがそれぞれに対応した値を持ちます。
その後、「あいさつ」ボタンをクリックすると時間帯に対応したあいさつの言葉がテキストブロックに表示されるというサンプルです。
このサンプルに手を加えて、例えばnowが「夜」かどうかをコードビハインドで判断して、夜の場合だけアニメーションを再生するというようなことはどのようにすれば可能でしょうか?
###サンプルコード
xaml
1<Window x:Class="GreetingApp.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:GreetingApp" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="450"> 9 <Canvas HorizontalAlignment="Left" Height="450" Margin="0.0,0,0,0" VerticalAlignment="Top" Width="450"> 10 <TextBlock x:Name="text" Height="100" Canvas.Left="111.688" TextWrapping="Wrap" Text="{Binding Path = Phrase}" Canvas.Top="98.052" Width="219.481" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="36"/> 11 <Button Click="Click_Morning" Content="朝" Canvas.Left="30" Canvas.Top="250" Width="100" Height="50" FontSize="24"/> 12 <Button Click="Click_Evening" Content="昼" Canvas.Left="170.26" Canvas.Top="250" Width="100" Height="50" FontSize="24"/> 13 <Button Click="Click_Night" Content="夜" Canvas.Left="310.519" Canvas.Top="250" Width="100" Height="50" FontSize="24"/> 14 <Button Click="Click_Greeting" Content="あいさつ" Canvas.Left="170.26" Canvas.Top="325.974" Width="100" Height="50" FontSize="24"/> 15 </Canvas> 16 17</Window>
c#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7using System.Windows; 8using System.Windows.Controls; 9using System.Windows.Data; 10using System.Windows.Documents; 11using System.Windows.Input; 12using System.Windows.Media; 13using System.Windows.Media.Imaging; 14using System.Windows.Navigation; 15using System.Windows.Shapes; 16 17namespace GreetingApp 18{ 19 20 public enum Period { MORNING, EVENING, NIGHT }; 21 22 /// <summary> 23 /// MainWindow.xaml の相互作用ロジック 24 /// </summary> 25 public partial class MainWindow : Window 26 { 27 GreetingPhrase ph = new GreetingPhrase(); 28 29 public MainWindow() 30 { 31 InitializeComponent(); 32 DataContext = ph; 33 } 34 35 private void Click_Morning(object sender, RoutedEventArgs e) 36 { 37 ph.now = Period.MORNING; 38 } 39 40 private void Click_Evening(object sender, RoutedEventArgs e) 41 { 42 ph.now = Period.EVENING; 43 } 44 45 private void Click_Night(object sender, RoutedEventArgs e) 46 { 47 ph.now = Period.NIGHT; 48 } 49 50 private void Click_Greeting(object sender, RoutedEventArgs e) 51 { 52 ph.ChangePhrase(); 53 } 54 } 55 56 public class GreetingPhrase : INotifyPropertyChanged 57 { 58 #region INotifyPropertyChanged の実装 59 public event PropertyChangedEventHandler PropertyChanged; 60 private void RaiseProeprtyChanged(string propertyName) 61 { 62 var h = this.PropertyChanged; 63 if (h != null) h(this, new PropertyChangedEventArgs(propertyName)); 64 } 65 #endregion INotifyPropertyChanged の実装 66 67 public string Phrase { get; set; } 68 69 public Period now { get; set; } 70 71 public void ChangePhrase() 72 { 73 switch (now) 74 { 75 case Period.MORNING: 76 Phrase = "おはよう!"; 77 break; 78 case Period.EVENING: 79 Phrase = "こんにちは!"; 80 break; 81 case Period.NIGHT: 82 Phrase = "こんばんは!"; 83 break; 84 } 85 RaiseProeprtyChanged("Phrase"); 86 } 87 } 88} 89
###サンプルプログラム実行時の画面
(文字のズレはごめんなさい)
###やりたかった実装
疑問が解決したのでやりたかった実装を以下に載せておきます。
C#
1using System.ComponentModel; 2using System.Windows; 3using System.Windows.Media.Animation; 4 5namespace Questions298961 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 private void Click_Morning(object sender, RoutedEventArgs e) => ph.Now = Period.MORNING; 20 21 private void Click_Evening(object sender, RoutedEventArgs e) => ph.Now = Period.EVENING; 22 23 private void Click_Night(object sender, RoutedEventArgs e) => ph.Now = Period.NIGHT; 24 25 private void Click_Greeting(object sender, RoutedEventArgs e) 26 { 27 ph.ChangePhrase(); 28 29 //ここにアニメーション用の条件分岐を入れました。 30 switch (ph.Now) 31 { 32 case Period.MORNING: 33 var sb = FindResource("MorningAnimation") as Storyboard; 34 BeginStoryboard(sb); 35 break; 36 37 case Period.EVENING: 38 sb = FindResource("EveningAnimation") as Storyboard; 39 BeginStoryboard(sb); 40 break; 41 42 case Period.NIGHT: 43 sb = FindResource("NightAnimation") as Storyboard; 44 BeginStoryboard(sb); 45 break; 46 } 47 48 } 49 } 50 51 public class GreetingPhrase : INotifyPropertyChanged 52 { 53 public string Phrase { get; set; } 54 55 private Period _Now; 56 public Period Now 57 { 58 get => _Now; 59 set 60 { 61 _Now = value; 62 RaiseProeprtyChanged(nameof(Now)); 63 } 64 } 65 66 public void ChangePhrase() 67 { 68 switch (Now) 69 { 70 case Period.MORNING: 71 Phrase = "おはよう!"; 72 break; 73 case Period.EVENING: 74 Phrase = "こんにちは!"; 75 break; 76 case Period.NIGHT: 77 Phrase = "こんばんは!"; 78 break; 79 } 80 RaiseProeprtyChanged(nameof(Phrase)); 81 } 82 83 #region INotifyPropertyChanged の実装 84 public event PropertyChangedEventHandler PropertyChanged; 85 private void RaiseProeprtyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 86 #endregion 87 } 88}
xamlの方はTN8001さんの書いてくださったものをそのまま使えると思うので割愛します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/10/20 05:55 編集
退会済みユーザー
2020/10/20 06:44
退会済みユーザー
2020/10/20 07:44
2020/10/20 08:47