WPF コントロールのフェードアウト 質問する

WPF コントロールのフェードアウト 質問する

私の 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);

おすすめ記事