繁体   English   中英

WPF淡入淡出动画只有一次

[英]wpf fade in animation working just one time

我创建了一个淡入和淡出动画,该动画由viewmodel中的属性更改触发。 第一次淡入和淡出时此效果很好,但每次重复此操作时,仅显示淡出,这意味着控件保持不可见,直到它闪烁到不透明度1,然后淡出。

XAML:

<DataTemplate x:Key="MessageTemplate">
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding FadeInAnimationState}" Value="Active">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
                            <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="1"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
        <DataTrigger Binding="{Binding FadeOutAnimationState}" Value="Active">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity">
                            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </DataTemplate.Triggers>
    <StatusBarItem>
        ...
    </StatusBarItem>
</DataTemplate>
...
<ContentPresenter ContentTemplate="{StaticResource MessageTemplate}" Content="{Binding}"/>

负责触发动画的Viewmodel属性:

private DisplayState _messageState;
private DisplayState MessageState
{
    get { return _messageState; }
    set
    {
        _messageState = value;
        if (value == DisplayState.Displayed)
        {
            FadeOutAnimationState = AnimationState.Inactive;
            FadeInAnimationState = AnimationState.Active;
        }
        else
        {
            FadeInAnimationState = AnimationState.Inactive;
            FadeOutAnimationState = AnimationState.Active;
        }
    }
}

public AnimationState FadeInAnimationState
{
    ... // getter and setter with NotfiyPropertyChanged
}

public AnimationState FadeOutAnimationState
{
    ... // getter and setter with NotfiyPropertyChanged
}

和调用(调试):

MessageState = DisplayState.Displayed;
await Task.Delay(duration);
MessageState = DisplayState.Hidden;
await Task.Delay(TimeSpan.FromSeconds(1));

我在做什么呢?

处理完情节提要后,您需要将其删除。 就像是:

 <DataTrigger.EnterActions>
   <RemoveStoryboard BeginStoryboardName="FadeIn" />
   <RemoveStoryboard BeginStoryboardName="FadeOut" />       
   <BeginStoryboard Name="FadeIn">           
       <Storyboard>
          ...
       </Storyboard>
   </BeginStoryboard>
 </DataTrigger.EnterActions>

(和FadeOut ,给它起一个名字)

或者,您可以在ExitActions上执行此ExitActions

 <DataTrigger.EnterActions>
   <BeginStoryboard Name="FadeIn">           
       <Storyboard>
          ...
       </Storyboard>
   </BeginStoryboard>
 </DataTrigger.EnterActions>
 <DataTrigger.ExitActions>
   <RemoveStoryboard BeginStoryboardName="FadeIn" />
 </DataTrigger.ExitActions>

否则,最后一个情节提要板将保持“推送”其最后一个值,因此您不会看到任何更改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM