2012-04-24 12 views
4

MVVMで成功メッセージを表示するためにテキストブロックをフェードアウトしようとしていますが、もう一度フェードアウトすることはできません。私はこれを見て:WPF MVVM Property Change Animationしかし、実際には従っていない。ここ スタイルです: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はセッターとプロパティをある
SuccessMessage = "Success"; 

PropertyChangedを呼び出します。私はテキストを「あなたの保存は成功しました」のようなものに固定したいと思いますが、どのような場合でも、ユーザーが再度保存した場合に、テキストブロックがフェードインしてから再度出力するようにすることができます。私は何をする必要がありますか?

EDIT(私は8時間の自己お答えできません): バインディングにNotifyOnTargetUpdatedを追加する必要がありましたし、今では中とフェードアウト:

<TextBlock Text="{Binding SuccessMessage, NotifyOnTargetUpdated=True}" Style="{StaticResource fadeInOut}" 

私は今のような1つのTextBoxを持っていますヤコブの答えあたり(しかしBinding.TargetUpdatedにEventTriggerを変更)このような上記と1つの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> 

と3つのすべてのフェードとアウトを保存します。奇妙なことに、テンプレート化されたものは、同じタイミングを使用するにもかかわらず、他の2つの後ろに少し遅れる。

答えて

2

DoubleAnimation.BeginTimeを設定してみてください。そうすれば、フェードインアニメーションの開始時間を延期し、フェードインが終了する前に開始しないようにすることができます。

<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を使用することができますが、その後、あなたがフェードアウトする前にテキストを表示するためにどのくらいの時間を制御することができません。次の例ではテキストがフェードアウトする前に2秒間表示されます。


UPDATE:

のTextBlockは、あなたがトリガーに使用できる任意の適切なイベントを持っていないためのTextBlockで動作するようにトリガいくつかの問題イベントでフェージング取得があるようです。以下は、TextBlockの代わりにTextBoxを使用した実例です。 TextBlockはもっと軽量ですが、TextBlockのように見えるようにTextBoxをスタイルすることができます。

<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> 
+0

私はそれを試みましたが、まだフェードアウトしません。 – Nix

+0

@Nix:私はあなたにコードを試しました。正直なところ、TextBlock(fadeinもfadeoutもない)で動作させることはできません。しかし、私はそれをTextBoxで動作させることができます。上記の私の更新答えを見てください。 –

+0

私は自己回答しました - それは拘束力がありましたが、タイミングに関するあなたの助けに感謝します。 – Nix

関連する問題