ユーザーコントロールの可視性が非表示に変わるたびに発生する非常に単純なフェードアウト効果を作成しようとしています。
これを行うために、ユーザー コントロールの可視性が非表示に変わるたびにトリガーされるストーリーボードを作成しました。次に、最初に可視性を再び可視に変更して、アニメーション化できるようにします。次に、時間の経過とともに不透明度を変更し、最後に可視性を非表示に変更します。ただし、これにより、アニメーションが永遠に繰り返されます。
最終フレームでコントロールを表示から折りたたみに変更すると、一度は機能しますが、ユーザー コントロールは再び表示されることはありません (私はIsVisibleChanged
イベントをリッスンし、一度折りたたまれた後にトリガーされることはありません。control.Visibility = Visibility.Visible;
そのイベント ハンドラーの最後にあるコード。
では、アニメーションが 1 回だけトリガーされるようにするにはどうすればよいでしょうか。できればコード ビハインドを使用せずに、このフェードアウト コントロールを素敵なリソース ディクショナリに追加するだけで、常に機能します。SO でこれに関連するいくつかの質問を見てきましたが、特にこれは機能しません。
私がこれまでに持っているコード:
<UserControl.Style>
<Style TargetType="{x:Type UserControl}">
<Style.Triggers>
<Trigger Property="Visibility" Value="Hidden">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Visible</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:3" FillBehavior="Stop"/>
<ObjectAnimationUsingKeyFrames BeginTime="0:0:3.5" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<Visibility>Hidden</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Style>