【问题标题】:Storyboard animation in MVVMMVVM 中的故事板动画
【发布时间】:2012-04-24 12:30:14
【问题描述】:

我正在尝试淡入文本块然后淡出以在 MVVM 中显示成功消息,但我无法让它再次淡出。我看过这个:WPF MVVM Property Change Animation 但并没有真正关注。 这是样式:

 <Style TargetType="TextBlock" x:Key="fadeinout">
        <Style.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="0.0" To="1.0" Duration="0:0:5"/>
                        <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="1.0" To="0.0" Duration="0:0:5"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

在视图中

<TextBlock Text="{Binding Path=SuccessMessage}" Style="{StaticResource fadeinout}"  Width="60"/>

在视图模型中,保存后我这样做:

SuccessMessage = "Success";

其中 SuccessMessage 是具有调用 PropertyChanged 的​​设置器的属性。我想我希望将文本固定为“您的保存成功”之类的内容,但无论如何我希望视图模型能够执行使文本块淡入然后再次淡出的操作,并在用户再次保存时重复。我需要做什么?

编辑(我 8 小时无法自行回答): 必须将 NotifyOnTargetUpdated 添加到绑定中,现在它淡入淡出:

 <TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Style="{StaticResource fadeInOut}"

根据 Jakob 的回答,我现在有一个 TextBox(但将 EventTrigger 更改为 Binding.TargetUpdated),一个像上面一样的 TextBlock 和一个像这样的 TextBlock 内联:

<TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Opacity="0" x:Name="tbMessage" Width="60" HorizontalAlignment="Left">
        <TextBlock.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="tbMessage" Storyboard.TargetProperty="Opacity" To="1" BeginTime="0:0:0" Duration="0:0:1" />
                        <DoubleAnimation Storyboard.TargetName="tbMessage" Storyboard.TargetProperty="Opacity" To="0" BeginTime="0:0:3" Duration="0:0:1"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBlock.Triggers>
    </TextBlock>

并且所有三个都随着每次保存而淡入淡出。奇怪的是,尽管使用相同的时序,但模板化的一个略微落后于其他两个。

【问题讨论】:

    标签: wpf storyboard


    【解决方案1】:

    尝试设置DoubleAnimation.BeginTime。这样你就可以推迟淡出动画的开始时间,这样它就不会在淡入完成之前开始。在以下示例中,文本会在淡出之前显示 2 秒:

    <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="0.0" To="1.0" Duration="0:0:5" BeginTime="0:0:0" />
    <DoubleAnimation Storyboard.TargetProperty="(TextBlock.Opacity)" From="1.0" To="0.0" Duration="0:0:5" BeginTime="0:0:7" />
    

    您也可以使用AutoReverse,但您将无法控制在淡出之前显示文本的时间。


    更新:

    似乎有一些问题随着事件触发器的褪色与 TextBlock 一起使用,因为 TextBlock 没有任何可以在触发器中使用的适当事件。以下是我使用 TextBox 而不是 TextBlock 的工作示例。您始终可以设置 TextBox 的样式,使其看起来像 TextBlock,即使 TextBlock 更轻量级:

    <TextBox Text="{Binding SuccessMessage}" Opacity="0" x:Name="textBoxMessage" >
        <TextBox.Triggers>
            <EventTrigger RoutedEvent="TextBoxBase.TextChanged">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation 
                                    Storyboard.TargetName="textBoxMessage" 
                                    Storyboard.TargetProperty="Opacity"
                                    To="1" 
                                    BeginTime="0:0:0" Duration="0:0:1"
                                    />
                        <DoubleAnimation 
                                    Storyboard.TargetName="textBoxMessage" 
                                    Storyboard.TargetProperty="Opacity"
                                    To="0" 
                                    BeginTime="0:0:3" Duration="0:0:1"
                                    />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </TextBox.Triggers>
    </TextBox>
    

    【讨论】:

    • @Nix:我刚刚尝试了你的代码,老实说,我无法让它与 TextBlock 一起工作(无论是淡入还是淡出)。但是,我可以让它与 TextBox 一起使用。请参阅上面的更新答案。
    • 我自己回答了 - 这是绑定,但感谢您在时间安排方面的帮助。
    猜你喜欢
    • 2011-07-11
    • 2012-02-21
    • 2021-05-05
    • 2020-05-19
    • 1970-01-01
    • 2011-01-28
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多