更新源时不触发WPF TextBlock动画

更新源时不触发WPF TextBlock动画,wpf,xaml,Wpf,Xaml,我只是想在更新这个文本块的源代码时,让一些文本瞬间闪烁成红色。TextBlock绑定到的文本工作正常,但由于某些原因,动画无法启动。我有点不知所措 有什么想法吗 <Border BorderBrush="{StaticResource Button.BackgroundBrush}" Background="{StaticResource Screener.Background}" Bo

我只是想在更新这个文本块的源代码时,让一些文本瞬间闪烁成红色。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>

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

每个绑定由两个端点组成—一个源和一个目标。目标是在其上设置绑定的对象,目标属性是将绑定其值的
DependencyProperty
,源是将解析
绑定的对象。路径
,源属性是将目标属性绑定到的属性。在您的例子中,目标是
TextBlock
,目标属性是
Text
,源是(继承的)数据上下文(我认为是视图模型),源属性是
AlertBoxMessage

您可能知道绑定可以在几种模式下工作<代码>双向将允许在源到目标和目标到源的两个方向进行更新,而
单向
将只进行源到目标的更新

这里的关键信息是,每当目标到源传输发生时,
Binding.SourceUpdated
将被触发(对于源到目标传输,请参阅
Binding.TargetUpdated
)。但是,在您的情况下,该值总是在源到目标的方向上更新,因为您将绑定模式设置为单向,因此永远不会引发binding.SourceUpdated。为了实现您的目标,您应该使用
Binding.TargetUpdated
事件(将
Binding.NotifyOnTargetUpdated
设置为
true

但是,您的代码还存在一些其他问题,这些问题将阻止它工作,所以让我们来讨论一下:

  • 您正在尝试使用
    ColorAnimation
    设置
    TextBlock.Foreground
    属性(类型为
    Brush
    )的动画,该属性只能用于设置类型为
    Color
    的属性的动画,并且您将得到一个
    invalidoOperationException
    。您应该设置
    StoryBoard.TargetProperty=“Foreground.Color”
  • 这似乎有点违反直觉,但设置
    RepeatBehavior=“3”
    将使动画重复3天,而不是3次(请参阅)。您应该使用
    RepeatBehavior=“3x”
  • 总而言之,以下代码应该满足您的期望:

    <TextBlock Text="{Binding AlertBoxMessage, Mode=OneWay, NotifyOnTargetUpdated=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.TargetUpdated">
                        <BeginStoryboard>
                            <Storyboard Storyboard.TargetProperty="Foreground.Color">
                                <ColorAnimation From="Black"
                                                To="Red"
                                                AutoReverse="True" 
                                                RepeatBehavior="3x"
                                                Duration="0:0:2"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    

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

    每个绑定由两个端点组成—一个源和一个目标。目标是在其上设置绑定的对象,目标属性是将绑定其值的
    DependencyProperty
    ,源是将解析
    绑定的对象。路径
    ,源属性是将目标属性绑定到的属性。在您的例子中,目标是
    TextBlock
    ,目标属性是
    Text
    ,源是(继承的)数据上下文(我认为是视图模型),源属性是
    AlertBoxMessage

    您可能知道绑定可以在几种模式下工作<代码>双向将允许在源到目标和目标到源的两个方向进行更新,而
    单向
    将只进行源到目标的更新

    这里的关键信息是,每当目标到源传输发生时,
    Binding.SourceUpdated
    将被触发(对于源到目标传输,请参阅
    Binding.TargetUpdated
    )。但是,在您的情况下,该值总是在源到目标的方向上更新,因为您将绑定模式设置为单向,因此永远不会引发binding.SourceUpdated。为了实现您的目标,您应该使用
    Binding.TargetUpdated
    事件(将
    Binding.NotifyOnTargetUpdated
    设置为
    true

    但是,您的代码还存在一些其他问题,这些问题将阻止它工作,所以让我们来讨论一下:

  • 您正在尝试使用
    ColorAnimation
    设置
    TextBlock.Foreground
    属性(类型为
    Brush
    )的动画,该属性只能用于设置类型为
    Color
    的属性的动画,并且您将得到一个
    invalidoOperationException
    。您应该设置
    StoryBoard.TargetProperty=“Foreground.Color”
  • 这似乎有点违反直觉,但设置
    RepeatBehavior=“3”
    将使动画重复3天,而不是3次(请参阅)。您应该使用
    RepeatBehavior=“3x”
  • 总而言之,以下代码应该满足您的期望:

    <TextBlock Text="{Binding AlertBoxMessage, Mode=OneWay, NotifyOnTargetUpdated=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.TargetUpdated">
                        <BeginStoryboard>
                            <Storyboard Storyboard.TargetProperty="Foreground.Color">
                                <ColorAnimation From="Black"
                                                To="Red"
                                                AutoReverse="True" 
                                                RepeatBehavior="3x"
                                                Duration="0:0:2"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    
    
    
    试试这个?试试这个?非常感谢。你的帖子非常有用。我只是为了好玩才这么做的,所以我在这方面还是个新手。有时,我只是直接编写代码,不去想我是在处理目标/源代码,还是希望我的绑定模式是单向的还是单向的源代码。我也忘了考虑刷子而不是颜色。