gpt4 book ai didi

wpf - 如何淡出,更改和再次淡入文本?

转载 作者:行者123 更新时间:2023-12-04 07:10:05 25 4
gpt4 key购买 nike

我在数据模板中为数据网格中的单元格使用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"
    <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);
    }
    }

    如果您不想为此使用 Blend SDK的交互性,则只需获取代码并将其重构为单独的类,然后使用TextBlock的 Loaded事件进行设置。

    关于wpf - 如何淡出,更改和再次淡入文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221674/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com