Wpf 如何淡出、更改和淡入文本?

Wpf 如何淡出、更改和淡入文本?,wpf,animation,fade,textblock,Wpf,Animation,Fade,Textblock,我在datagrid中的单元格的datatemplate中使用TextBlock。我有一个要求,当单元格的值发生变化时,文本应: 在更换前淡出 价值应该改变 重新淡入 此时,我使用TargetUpdated RoutedEvent触发动画,使文本淡出,然后返回。但淡入淡出发生在文本已经改变了屏幕上的值之后 <DataTemplate> <Border> <TextBlock Name="templateTextBlock" Text="{

我在datagrid中的单元格的datatemplate中使用TextBlock。我有一个要求,当单元格的值发生变化时,文本应:

  • 在更换前淡出
  • 价值应该改变
  • 重新淡入
此时,我使用TargetUpdated RoutedEvent触发动画,使文本淡出,然后返回。但淡入淡出发生在文本已经改变了屏幕上的值之后

<DataTemplate>
    <Border>
        <TextBlock Name="templateTextBlock" Text="{Binding Path=FirstName, NotifyOnTargetUpdated=True}" />
    </Border>
    <DataTemplate.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard>
                <Storyboard AutoReverse="True">
                    <DoubleAnimation Storyboard.TargetName="templateTextBlock" Storyboard.TargetProperty="Opacity" To=".1" Duration="0:0:.5" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

我的问题是如何实现所需的效果-淡出、更改文本、淡入


非常感谢。

写了一个互动行为,应该做到这一点:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

类AnimatedTextChangeBehavior:行为
{
公共持续时间AnimationDuration{get;set;}
私有字符串OldValue=null;
私有字符串NewValue=null;
双动画输出;
双动画;
受保护的覆盖无效附加()
{
base.onatached();
AnimationOut=新的DoubleAnimation(1,0,AnimationDuration,FillBehavior.HoldEnd);
AnimationIn=新的双动画(0,1,AnimationDuration,FillBehavior.HoldEnd);
动画输出完成+=(输出,输出)=>
{
AssociatedObject.SetCurrentValue(TextBlock.TextProperty,NewValue);
旧值=新值;
AssociatedObject.BeginAnimation(TextBlock.OpacityProperty,AnimationIn);
};
Binding.AddTargetUpdatedHandler(AssociatedObject,new EventHandler(已更新));
}
私有无效已更新(对象发送方、数据传输方)
{
字符串值=AssociatedObject.GetValue(TextBlock.TextProperty)作为字符串;
AssociatedObject.BeginAnimation(TextBlock.OpacityProperty,AnimationOut);
NewValue=值;
if(OldValue==null)
{
旧价值=价值;
}
AssociatedObject.SetCurrentValue(TextBlock.TextProperty,OldValue);
}
}

如果你不想使用的交互性,你可以将代码重构成一个单独的类,然后使用TextBlock的
Loaded
事件进行设置。

愚蠢的获胜要求。我真的很高兴找到了这篇文章。我用了2个文本块和动画来做这个。这要干净得多。@H.B.我可以知道@abccba:的哪个名称空间引用引用了我在下面的代码段中定义的类的名称空间吗。因此,类似于
clr namespace:YourProject.YourNamespace
,这取决于您将其放置在何处。值得指出的是,文本绑定的
NotifyOnSourceUpdated=True
必须存在,否则此行为将不起作用(无论如何,我还是被它抓住了!)。
<TextBlock Text="{Binding Name, NotifyOnTargetUpdated=True}">
    <i:Interaction.Behaviors>
        <b:AnimatedTextChangeBehavior AnimationDuration="0:0:0.1" />
    </i:Interaction.Behaviors>
</TextBlock>
class AnimatedTextChangeBehavior : Behavior<TextBlock>
{
    public Duration AnimationDuration { get; set; }

    private string OldValue = null;
    private string NewValue = null;

    DoubleAnimation AnimationOut;
    DoubleAnimation AnimationIn;

    protected override void OnAttached()
    {
        base.OnAttached();

        AnimationOut = new DoubleAnimation(1, 0, AnimationDuration, FillBehavior.HoldEnd);
        AnimationIn = new DoubleAnimation(0, 1, AnimationDuration, FillBehavior.HoldEnd);
        AnimationOut.Completed += (sOut, eOut) =>
        {
            AssociatedObject.SetCurrentValue(TextBlock.TextProperty, NewValue);
            OldValue = NewValue;
            AssociatedObject.BeginAnimation(TextBlock.OpacityProperty, AnimationIn);
        };

        Binding.AddTargetUpdatedHandler(AssociatedObject, new EventHandler<DataTransferEventArgs>(Updated));
    }

    private void Updated(object sender, DataTransferEventArgs e)
    {
        string value = AssociatedObject.GetValue(TextBlock.TextProperty) as string;
        AssociatedObject.BeginAnimation(TextBlock.OpacityProperty, AnimationOut);
        NewValue =  value;
        if (OldValue == null)
        {
            OldValue = value;
        }
        AssociatedObject.SetCurrentValue(TextBlock.TextProperty, OldValue);
    }
}