WPF动画开始但显示太晚了

Rog*_*sem 8 c# silverlight wpf animation

我正在使用.Net 4.0构建一些WPF控件.其中一个名为LoadingPane的控件是从ContentControl派生的自定义控件.此LoadingPane控件的唯一作用是当IsLoading属性设置为true时,在其包含的内容上显示半透明层.当IsLoading值改变时,我使用一些动画来淡入淡出.当显示叠加层时,动画会旋转一圈椭圆.

到现在为止还挺好.一切都很好.但这是我的问题:当我将Loading属性设置为true时,动画不会直接显示.大概需要半秒钟.此时淡入动画已经运行,因此不透明度在一步中有效地从0变为1.

这是我的动画代码:

<ControlTemplate.Triggers>
    <Trigger Property="IsLoading"
             Value="True">
        <Trigger.EnterActions>
            <RemoveStoryboard BeginStoryboardName="EndAnimateLoadingCanvas" />
            <BeginStoryboard Name="AnimateLoadingCanvas">
                <Storyboard FillBehavior="Stop">
                    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00"
                                                   Storyboard.TargetName="MyViewBoxje"
                                                   Storyboard.TargetProperty="Visibility">
                        <DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
                    </ObjectAnimationUsingKeyFrames>

                    <DoubleAnimation BeginTime="00:00:00"
                                     Duration="00:00:00.5"
                                     Storyboard.TargetName="MyViewBoxje"
                                     Storyboard.TargetProperty="Opacity"
                                     To="1" />

                    <DoubleAnimation BeginTime="00:00:00"
                                     Duration="00:00:02"
                                     Storyboard.TargetName="AnimatedRotateTransform"
                                     Storyboard.TargetProperty="Angle"
                                     From="360"
                                     To="0"
                                     RepeatBehavior="Forever" />

                </Storyboard>
            </BeginStoryboard>
        </Trigger.EnterActions>
        <Trigger.ExitActions>
            <RemoveStoryboard BeginStoryboardName="AnimateLoadingCanvas" />
            <BeginStoryboard Name="EndAnimateLoadingCanvas">
                <Storyboard FillBehavior="Stop">
                    <DoubleAnimation BeginTime="00:00:00"
                                     Duration="00:00:00.5"
                                     Storyboard.TargetName="MyViewBoxje"
                                     Storyboard.TargetProperty="Opacity"
                                     To="0" />
                    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00.5"
                                                   Storyboard.TargetName="MyViewBoxje"
                                                   Storyboard.TargetProperty="Visibility">
                        <DiscreteObjectKeyFrame Value="{x:Static Visibility.Collapsed}" />
                    </ObjectAnimationUsingKeyFrames>

                </Storyboard>
            </BeginStoryboard>
        </Trigger.ExitActions>
    </Trigger>
</ControlTemplate.Triggers>
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我在测试窗口中使用此控件时,我反复单击"加载"复选框(并在动画完成之前),然后淡入/淡出动画确实可以正常工作.

有人可以帮忙吗?Thanx提前!

Rog*_*sem 0

读了Isak的回答后我终于明白了。很抱歉,他的回答对我的情况没有帮助,但他让我朝着正确的方向前进。

第一次淡入似乎不起作用的原因是因为我的包含视图框将其可见性设置为在执行淡入动画的整个过程中折叠。这是由 ObjectAnimationUsingKeyFrames 引起的:

    DiscreteObjectKeyFrame Value="{x:Static Visibility.Visible}" />
</ObjectAnimationUsingKeyFrames>
Run Code Online (Sandbox Code Playgroud)

没有指定持续时间,并且指定的单个关键帧动画太晚了。

添加

Duration="00:00:00"
Run Code Online (Sandbox Code Playgroud)

解决了我的问题。

感谢大家的帮助!