我正试图淡化文本块然后在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的setter的属性。我想我希望文本固定为“你的保存是成功的”,但无论如何我希望viewmodel能够做一些使文本块淡入然后再出来的东西,并在用户再次保存时重复。我需要做什么?
编辑(我无法自行回答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>
每次保存时,所有三个都会淡入淡出。奇怪的是,尽管使用相同的时间,模板化的人略微落后于其他两个。
答案 0 :(得分:2)
尝试设置DoubleAnimation.BeginTime
。这样你就推迟了fadeout动画的开始时间,这样它就不会在fadein结束之前启动。在以下示例中,文本在淡出之前显示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>