私の WPF アプリには、ユーザー アクション (データの保存、削除など) が完了した後に表示されるフィードバック コントロールがあります。最初は可視性が Hidden に設定され、スタイルはリソースとして定義されている animateFadeOut スタイルに設定されています (以下を参照)。次に、C# コードでテキストとコントロールの Visibility を visible に設定し、フィードバック コントロールにメッセージを表示して 5 秒後にフェードアウトし、非表示のままにします (Visibility.Hidden)。
次の XAML は、control.Visiblity= Visibility.Visible を最初に呼び出したときには機能しますが、2 回目にはコントロールが再表示されません。これは、フィードバック コントロールを制御するアニメーションがまだ実行中であるためだと考えられます。次に、FillBehavior を "Stop" に設定しようとしましたが、コントロールが再び表示されるだけなので、非表示にしたいと考えました。次に、FillBehavior="Stop" で、"Opacity = 0 の場合、Visibility を Hidden に設定する" というトリガーを設定しようとしました。トリガーは起動しなかったようで、アニメーションが完了した後、コントロールが再び表示されました。
ここで私が何を間違っているのか指摘してください。
あるいは、5 秒後にフェードアウトして何度でも呼び出せるコントロールを表示するより良い方法を提案していただければ幸いです。
ありがとう!
<Style TargetType="{x:Type FrameworkElement}" x:Key="animateFadeOut"> <Style.Triggers> <Trigger Property="Visibility" Value="Visible"> <Trigger.EnterActions> <BeginStoryboard > <Storyboard> <DoubleAnimation BeginTime="0:0:5.0" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:0.5"/> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> </Trigger> </Style.Triggers> </Style>
ベストアンサー1
問題は、アニメーションが完了した後もコントロールの Visibility=Visible が維持されるため、再度入力できないことです。
最初にコントロールを表示し、次に非表示にする、という全体を実行するアニメーションを使用することをお勧めします。
<Storyboard x:Key="animate">
<ObjectAnimationUsingKeyFrames BeginTime="0:0:0" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation BeginTime="0:0:0.0" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.2"/>
<DoubleAnimation BeginTime="0:0:5.0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:0.5"/>
<ObjectAnimationUsingKeyFrames BeginTime="0:0:5.5" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Hidden</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
次のように使用します。
((Storyboard)FindResource("animate")).Begin(someControl);