WPF淡出控件

son*_*erd 18 c# wpf animation storyboard

在我的WPF应用程序中,我有一个反馈控件,我希望在用户操作完成后显示(保存数据,删除...).可见性设置为隐藏开始,样式设置为定义为资源的animateFadeOut样式(参见下文).然后我想在我的C#代码中设置文本并控制Visibility可见,并让反馈控件显示消息并在5秒后淡出并保持隐藏(Visibility.Hidden).

以下XAML在我第一次调用control.Visiblity = Visibility.Visible时工作,但控件第二次不再出现.我想这是因为动画仍然在运行,它可以控制反馈控制.然后我尝试将FillBehavior设置为"停止",但这只是让控件再次可见,我希望它隐藏起来.然后,使用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>
Run Code Online (Sandbox Code Playgroud)

alp*_*use 31

问题是,在动画完成后,您的控件仍然具有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>
Run Code Online (Sandbox Code Playgroud)

并使用如下:

((Storyboard)FindResource("animate")).Begin(someControl);
Run Code Online (Sandbox Code Playgroud)


Kai*_*ang 16

Liz对于Visibility仍然可见是正确的.alpha-mouse也是正确的,您需要在某些时候将其设置为隐藏.但是如果你在动画完成之前将它设置回来,它将无法工作:

MyControl.Visibility = System.Windows.Visibility.Visible;
MyControl.Visibility = System.Windows.Visibility.Hidden;
Run Code Online (Sandbox Code Playgroud)

因为动画具有更高的优先级(MSDN)

您可以将其设置回Storyboard中的Hidden.Completed事件:

private void Show()
    {
        MyControl.Visibility = System.Windows.Visibility.Visible;

        var a = new DoubleAnimation
                    {
                        From = 1.0,
                        To = 0.0,
                        FillBehavior= FillBehavior.Stop,
                        BeginTime = TimeSpan.FromSeconds(2),
                        Duration = new Duration(TimeSpan.FromSeconds(0.5))
                    };
        var storyboard = new Storyboard();

        storyboard.Children.Add(a);
        Storyboard.SetTarget(a, MyControl);
        Storyboard.SetTargetProperty(a, new PropertyPath(OpacityProperty));
        storyboard.Completed += delegate { MyControl.Visibility = System.Windows.Visibility.Hidden; };
        storyboard.Begin();            
    }
Run Code Online (Sandbox Code Playgroud)


son*_*erd 12

这是我的工作.这会使控件再次进入和退出.我没有玩Visibility,而只是玩Opacity来处理它.

感谢Kane在这篇关于原始代码的帖子中:使用WPF动画淡化任何控件

Storyboard storyboard = new Storyboard();
TimeSpan duration = TimeSpan.FromMilliseconds(500); //

DoubleAnimation fadeInAnimation = new DoubleAnimation() 
    { From = 0.0, To = 1.0, Duration = new Duration(duration) };

DoubleAnimation fadeOutAnimation = new DoubleAnimation()
    { From = 1.0, To = 0.0, Duration = new Duration(duration) };
fadeOutAnimation.BeginTime = TimeSpan.FromSeconds(5);

Storyboard.SetTargetName(fadeInAnimation, element.Name);
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath("Opacity", 1));
storyboard.Children.Add(fadeInAnimation);
storyboard.Begin(element);

Storyboard.SetTargetName(fadeOutAnimation, element.Name);
Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath("Opacity", 0));
storyboard.Children.Add(fadeOutAnimation);
storyboard.Begin(element);
Run Code Online (Sandbox Code Playgroud)