UserControl不透明度淡化可见性

时间:2012-01-11 18:09:38

标签: c# wpf xaml animation

之前已经解决了这个问题,但我无法让它正常工作......应该非常简单!

这是我的XAML:

<UserControl.Style>
    <Style TargetType="UserControl">
        <Style.Triggers>
            <Trigger Property="Visibility" Value="Visible">
                <Trigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard x:Name="FadeOutAnimation">
                            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                FillBehavior="Stop"
                                BeginTime="0:0:5" From="1.0" To="0.0"
                                Duration="0:0:1"/>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames 
                                Storyboard.TargetProperty="Visibility"
                                BeginTime="0:0:7">
                                <DiscreteObjectKeyFrame>
                                    <DiscreteObjectKeyFrame.Value>
                                        <Visibility>Hidden</Visibility>
                                    </DiscreteObjectKeyFrame.Value>
                                </DiscreteObjectKeyFrame>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </Trigger.ExitActions>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Style>

这可以按预期工作:当控件的Visibility属性设置为Visible时,控件显示5秒钟,然后淡出1秒钟。然后控件的可见性在7秒后重置为隐藏(奇怪,但是6,淡入淡出动画的总时间,还不够 - 我想是另一个MS错误!)。

在随后的Button.Click事件中,Visibility属性显示为冻结或锁定为隐藏,并且无法再次变为可见!

任何想法为什么不呢?

4 个答案:

答案 0 :(得分:1)

您的ExitActions Storyboard中的FillBehavior="Stop"有帮助吗? 我认为这个故事板具有可见性值。

看看How to: Set a Property After Animating It with a Storyboard

答案 1 :(得分:1)

由于动画范围内设置的属性无法跳过箍,如LPL发送链接所示(这真的有帮助!),我提出了一个代码,而不是XAML中的代码:

private void UserControl_IsVisibleChanged(object sender, 
    DependencyPropertyChangedEventArgs e)
{
    if (this.Visibility == Visibility.Visible)
    {
        DoubleAnimation fadeIn = new DoubleAnimation();
        fadeIn.From = 1d;
        fadeIn.To = 1d;
        fadeIn.Duration = new Duration(new TimeSpan(0, 0, 0));

        DoubleAnimation fade = new DoubleAnimation();
        fade.From = 1d;
        fade.To = 0d;
        fade.BeginTime = TimeSpan.FromSeconds(((MessageTextProperties)  
            DataContext).Duration);
        fade.Duration = new Duration(new TimeSpan(0, 0, 1));

        NameScope.SetNameScope(this, new NameScope());
        this.RegisterName(this.Name, this);

        Storyboard.SetTargetName(fadeIn, this.Name);
        Storyboard.SetTargetProperty(fadeIn, new PropertyPath
            (UIElement.OpacityProperty));

        Storyboard.SetTargetName(fade, this.Name);
        Storyboard.SetTargetProperty(fade, new PropertyPath
            (UIElement.OpacityProperty));

        Storyboard sb = new Storyboard();
        sb.Children.Add(fadeIn);
        sb.Children.Add(fade);

        sb.Completed += new EventHandler(sb_Completed);
        sb.Begin(this);
    }
}

void sb_Completed(object sender, EventArgs e)
{
    this.Visibility = Visibility.Hidden;
}

}

诀窍是sb_Completed。由于此在正在运行的动画范围内,因此可以将“可见性”重置为“隐藏”。

答案 2 :(得分:1)

可能对你也有用

void UControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if (this.Visibility == Visibility.Visible)
            {
                Storyboard sb = new Storyboard();
                DoubleAnimation da = new DoubleAnimation();
                da.From = 0;
                da.To = 1;
                da.Duration = new Duration(TimeSpan.FromSeconds(2));
                sb.Children.Add(da);
                Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
                Storyboard.SetTarget(da, this);
                sb.Completed += new EventHandler(sb_Completed);
                sb.Begin();
            }

            if (this.Visibility == Visibility.Hidden || this.Visibility == Visibility.Collapsed)
            {
                Storyboard sb = new Storyboard();
                DoubleAnimation da = new DoubleAnimation();
                da.From = 1;
                da.To = 0;
                da.Duration = new Duration(TimeSpan.FromSeconds(2));
                sb.Children.Add(da);
                Storyboard.SetTargetProperty(da, new PropertyPath(UserControl.OpacityProperty));
                Storyboard.SetTarget(da, this);
                sb.Completed += new EventHandler(sb_Completed);
                sb.Begin();
            }
        }

        void sb_Completed(object sender, EventArgs e)
        {
            this.Visibility = Visibility.Visible;
        }

答案 3 :(得分:1)

可以使用Transitionz附加属性(GithubNuGet

对Opacity进行动画处理(并可选择翻译)

作为一个简单的示例项目,请使用以下代码:

robocopy "\\Source\Folder" "\\Destination\Folder" /E /ZB /X /PURGE /COPY /TEE /LOG:D:\log.txt 

这导致此输出:

enter image description here