更新源时WPF TextBlock动画不会触发

时间:2017-02-07 04:38:58

标签: wpf xaml

当我更新此TextBlock的源时,我只是想让一些文本暂时闪烁红色。 TextBlock绑定的文本工作正常,但由于某种原因,动画不会被激活。我有点失落。

有什么想法吗?

            <Border BorderBrush="{StaticResource Button.BackgroundBrush}"
                    Background="{StaticResource Screener.Background}"
                    BorderThickness="0,1,0,0"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Stretch">
                <TextBlock Text="{Binding AlertBoxMessage, Mode=OneWay, NotifyOnSourceUpdated=True}"
                           Name="AlertBox"
                           MinHeight="55"
                           FontWeight="Normal"
                           FontSize="16"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           Foreground="Black">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <EventTrigger RoutedEvent="Binding.SourceUpdated" >
                                    <BeginStoryboard>
                                        <Storyboard Storyboard.TargetProperty="Foreground">
                                            <ColorAnimation From="Black"
                                                    To="Red"
                                                    AutoReverse="True" 
                                                    RepeatBehavior="3"
                                                    Duration="0:0:2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </Border>

1 个答案:

答案 0 :(得分:2)

首先,我认为你误解了Binding.SourceUpdated事件。

每个绑定包含两个端点 - 源和目标。目标是设置绑定的对象,target属性是DependencyProperty,其值将被绑定,source是要解析Binding.Path的对象,source属性是属性目标属性绑定的。在您的情况下,目标是TextBlock,目标属性是Text,source是(继承的)数据上下文(我认为是视图模型),source属性是AlertBoxMessage。< / p>

您可能知道绑定可以在多种模式下工作。 TwoWay将允许在源到目标和目标到源方向上进行更新,而OneWay只会执行源到目标的更新。

此处的关键信息是,每当发生目标到源传输时都会引发Binding.SourceUpdated(并且Binding.TargetUpdated用于源到目标传输,请参阅MSDN)。但是,在您的情况下,值始终在源到目标方向上更新,因为您将绑定模式设置为OneWay,因此永远不会引发Binding.SourceUpdated。要实现您的目标,您应该使用Binding.TargetUpdated事件(将Binding.NotifyOnTargetUpdated设置为true)。

但是您的代码还有其他几个问题会阻止它工作,所以让我们来看看它们:

  1. 您尝试使用TextBlock.ForegroundBrush属性(类型为ColorAnimation)设置动画,该属性只能用于为{{1}类型的属性设置动画},你将获得Color。您应该设置InvalidOperationException
  2. 这可能看起来有点违反直觉,但设置StoryBoard.TargetProperty="Foreground.Color"会使动画重复3天,而不是3次(请参阅this question)。您应该使用RepeatBehavior="3"
  3. 总结一下,这里的代码应该符合您的期望:

    RepeatBehavior="3x"