【问题标题】:wpf fade in animation working just one timewpf淡入动画只工作一次
【发布时间】:2016-03-11 17:51:06
【问题描述】:

我创建了一个淡入淡出动画,由视图模型中的属性更改触发。这在第一次淡入和淡出时工作正常,但每次我重复此操作时只会显示淡出,这意味着控件在闪烁到不透明度 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));

我在做什么啊?

【问题讨论】:

    标签: c# wpf animation


    【解决方案1】:

    完成后,您需要删除情节提要。比如:

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

    FadeOut 也一样,给它一个名字)

    或者,您可以在ExitActions

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

    否则最后一个故事板将继续“推送”其最后一个值,因此您将看不到任何更改

    【讨论】:

    • 只是想评论该名称必须在&lt;BeginStoryboard&gt;-Tag ^^ thx 为您的答案,完美的作品
    猜你喜欢
    • 2018-11-06
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2021-09-03
    • 2016-11-10
    • 2021-04-21
    相关资源
    最近更新 更多