example - wpf backgroundworker



Animazione storyboard in MVVM (1)

Sto cercando di svanire un blocco di testo in uscita per mostrare un messaggio di successo in MVVM ma non riesco a farlo scomparire di nuovo. Ho guardato questo: WPF MVVM Property Change Animation ma in realtà non seguo. ecco lo stile:

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

e nella vista

<TextBlock Text="{Binding Path=SuccessMessage}" Style="{StaticResource fadeinout}"  Width="60"/>

nel modello di vista, dopo il salvataggio faccio:

SuccessMessage = "Success";

dove SuccessMessage è una proprietà con un setter che chiama PropertyChanged. Penso di volere che il testo sia corretto in qualcosa come "Il tuo salvataggio ha avuto successo", ma in ogni caso voglio che il modellofotografico sia in grado di fare qualcosa che faccia sì che il blocco di testo si dissolva e poi si ripeta, e ripetere se l'utente salva di nuovo. Cosa devo fare?

EDIT (non posso rispondere autonomamente per 8 ore): ho dovuto aggiungere NotifyOnTargetUpdated al binding e ora si dissolve in e out:

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

Ora ho un TextBox come per la risposta di Jakob (ma ho modificato EventTrigger in Binding.TargetUpdated), un TextBlock come sopra e un TextBlock in linea come questo:

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

e tutte e tre le dissolvenze entrano ed escono con ogni salvataggio. Stranamente, il modello si ritarda leggermente dietro agli altri due nonostante utilizzi gli stessi tempi.


Prova a impostare DoubleAnimation.BeginTime . In questo modo si rimanda l'ora di inizio dell'animazione di dissolvenza in modo che non inizi prima che la dissolvenza sia terminata. Nell'esempio seguente il testo viene mostrato per 2 secondi prima di dissolvere:

<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" />

In alternativa puoi usare AutoReverse ma non sarai in grado di controllare per quanto tempo mostrare il testo prima di dissolversi.

AGGIORNARE:

Sembra che ci siano alcuni problemi che si stanno affievolendo con i trigger di evento per funzionare con TextBlock perché TextBlock non ha eventi appropriati che puoi usare in un trigger. Quello che segue è un esempio funzionante in cui ho usato TextBox invece di TextBlock. Puoi sempre modellare un TextBox in modo che assomigli ad un TextBlock anche se TextBlock è più leggero:

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




storyboard