MVVMで成功メッセージを表示するために、テキストブロックをフェードインしてフェードアウトしようとしていますが、再びフェードアウトさせることができません。私はこれを見ました:WPF MVVMプロパティ変更アニメーションですが、実際には従いません。ここにスタイルがあります:
<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を呼び出すセッターを持つプロパティです。テキストを「保存に成功しました」のように修正したいと思いますが、いずれにせよ、ビューモデルでテキストブロックをフェードインしてから再びフェードアウトさせ、ユーザーが再度保存した場合に繰り返すことができるようにしたいと思います。私は何をする必要がありますか?
編集(8時間自己回答できません):NotifyOnTargetUpdatedをバインディングに追加する必要がありましたが、フェードインおよびフェードアウトします:
<TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Style="{StaticResource fadeInOut}"
これで、Jakobの回答に従って1つのTextBoxができました(ただし、EventTriggerをBinding.TargetUpdatedに変更しました)、上記のような1つのTextBlockと、次のような1つの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>
保存するたびに、3つすべてがフェードインおよびフェードアウトします。奇妙なことに、同じタイミングを使用しているにもかかわらず、テンプレート化されたものは他の2つよりわずかに遅れています。