Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF淡出动画-可以';不要再改变不透明度了_C#_Wpf - Fatal编程技术网

C# WPF淡出动画-可以';不要再改变不透明度了

C# WPF淡出动画-可以';不要再改变不透明度了,c#,wpf,C#,Wpf,我有一个带有标签控件的WPF窗口,用于向用户发送消息。几秒钟后,我希望信息消失。为此,我创建了一个调度程序和一个故事板。(计时器延迟5秒,然后触发滴答事件,消息消失。)它成功地消失,但下一条消息的不透明度仍设置为0。(因此用户看不见。)显然,我尝试将不透明度设置回1,但没有例外,这失败了。(也就是说,我可以毫无问题地跳过那行代码,但执行后不透明度仍然为0。)有人能告诉我我做错了什么吗?下面是一个测试项目中的一些代码,其中只有一个标签控件、一个用于设置标签内容和淡入淡出动画的按钮,以及一个用于尝试

我有一个带有标签控件的WPF窗口,用于向用户发送消息。几秒钟后,我希望信息消失。为此,我创建了一个
调度程序和一个故事板。(计时器延迟5秒,然后触发滴答事件,消息消失。)它成功地消失,但下一条消息的不透明度仍设置为0。(因此用户看不见。)显然,我尝试将不透明度设置回1,但没有例外,这失败了。(也就是说,我可以毫无问题地跳过那行代码,但执行后不透明度仍然为0。)有人能告诉我我做错了什么吗?下面是一个测试项目中的一些代码,其中只有一个标签控件、一个用于设置标签内容和淡入淡出动画的按钮,以及一个用于尝试重置不透明度的按钮

XAML:


默认情况下,动画的
FillBehavior
设置为
HoldEnd
,这意味着动画保留目标属性的最终值。如果以后要重置该值,则需要删除动画,或者将FillBehavior设置为
停止
。然后可以为动画的
Completed
事件添加处理程序,以手动保留最终值

还请注意,不需要计时器来延迟动画的开始。您可以改为设置其
BeginTime
属性

最后,不需要故事板来设置单个属性的动画。您可以调用
UIElement.BeginAnimation

private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
    var animation = new DoubleAnimation
    {
        To = 0,
        BeginTime = TimeSpan.FromSeconds(5),
        Duration = TimeSpan.FromSeconds(2),
        FillBehavior = FillBehavior.Stop
    };

    animation.Completed += (s, a) => lblTest.Opacity = 0;

    lblTest.BeginAnimation(UIElement.OpacityProperty, animation);
}

private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
    lblTest.Opacity = 1;
}
这是由于动画的“填充行为”。它有效地保持动画后的值,并且不放弃,防止它被更新

这是一个简单的修复方法,将填充行为更改为“停止”,并添加一个事件处理程序,以便在动画之后将不透明度值更改为0(否则将返回1)

我已经用你的代码测试过了,效果很好


谢谢你,这非常有效。关于WPF,我还有很多东西要学,这会有所帮助。
private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
    lblTest.Content = "Testing1...Testing2...Testing3";
    lblTest.Opacity = 1;

    // Create a storyboard to contain the animations.
    Storyboard storyboard = new Storyboard();
    TimeSpan duration = new TimeSpan(0, 0, 2);

    // Create a DoubleAnimation to fade the not selected option control
    DoubleAnimation animation = new DoubleAnimation();

    animation.From = 1.0;
    animation.To = 0.0;
    animation.Duration = new Duration(duration);
    // Configure the animation to target de property Opacity
    Storyboard.SetTargetName(animation, lblTest.Name);
    Storyboard.SetTargetProperty(animation, new PropertyPath(Control.OpacityProperty));
    // Add the animation to the storyboard
    storyboard.Children.Add(animation);

    // Begin the storyboard
    storyboard.Begin(this);
}

private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
    lblTest.Opacity = 1;
}
private void btnChangeLabel_Click(object sender, RoutedEventArgs e)
{
    var animation = new DoubleAnimation
    {
        To = 0,
        BeginTime = TimeSpan.FromSeconds(5),
        Duration = TimeSpan.FromSeconds(2),
        FillBehavior = FillBehavior.Stop
    };

    animation.Completed += (s, a) => lblTest.Opacity = 0;

    lblTest.BeginAnimation(UIElement.OpacityProperty, animation);
}

private void btnResetOpacity_Click(object sender, RoutedEventArgs e)
{
    lblTest.Opacity = 1;
}
animation.FillBehavior = FillBehavior.Stop;
animation.Completed += delegate 
{
    lblTest.Opacity = 0;
};