Déclenchement du Storyboard WPF sur la propriété modifiée
-
06-07-2019 - |
Question
J'ai un DataTemplate destiné à une classe qui implémente INotifyPropertyChanged. Existe-t-il un moyen de déclencher un storyboard quand une propriété change et un autre storyboard sur différentes valeurs (c'est un bool dans ce cas)?
Et existe-t-il un moyen de déclencher un storyboard au démarrage en fonction des valeurs de la classe pour laquelle le modèle de données est créé?
La solution
Oui, vous pouvez le faire.
Ajouter un DataTrigger et lier à la propriété respective. Voici un exemple:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
<BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
</DataTrigger>
</DataTemplate.Triggers>
Vous pouvez définir la valeur à tester comme bon vous semble. Vous pouvez donc définir le storyboard pour qu'il commence lorsque votre valeur passe à false. Vous pouvez ajouter autant de DataTriggers (ou d’autres déclencheurs) que vous le souhaitez.
Notez que dans mon exemple, je fais référence à une propriété factice et à un storyboard.
Lorsque la propriété sera modifiée, la liaison sera mise à jour et déclenchera le déclencheur en raison de la liaison de données.
Cette technique devrait également fonctionner au démarrage.
Autres conseils
Semblable à l’affiche ci-dessus, j’ai également utilisé un DataTrigger, puis l’a lié à une propriété de mon ViewModel. La seule chose que j'ai trouvée déroutante était de savoir où placer le déclencheur de données. Je le mets directement dans le nœud racine (c'est-à-dire Window). Je l'ai créé en utilisant Expression Blend, qui s'est occupé des détails de nommage des balises pour moi.
Veillez également à inclure dans votre projet une référence à "Microsoft.Expression.Interactions"
.XAML: (cela va directement dans le noeud racine)
<Window
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
x:Name="window" >
...
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON">
<ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"
ControlStoryboardOption="Play"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
...
</Window>
Modèle de vue:
private void TurnOnFlashingBackround()
{
FlashingBackground = "ON";
}
private string _FlashingBackround = "OFF";
public string FlashingBackground
{
get { return _FlashingBackround; }
private set
{
if (FlashingBackground == value)
{
return;
}
_FlashingBackround = value;
this.OnPropertyChanged("FlashingBackground");
}
}
public new event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Enfin, le modèle de vue doit hériter de "INotifyPropertyChanged"
.