WPF Storyboard Gatilho na propriedade mudou
-
06-07-2019 - |
Pergunta
Eu tenho um DataTemplate que é para uma classe que implementa INotifyPropertyChanged. Existe alguma maneira de provocar um storyboard quando uma propriedade mudanças e um storyboard diferente em diferentes valores (seu um bool neste caso)?
E há alguma maneira de provocar um storyboard na inicialização dependendo valores na classe que o datatemplate é feita para?
Solução
Sim, você pode fazer isso.
Adicionar um DataTrigger e se ligam à respectiva propriedade. Aqui está um exemplo:
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
<BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
</DataTrigger>
</DataTemplate.Triggers>
Você pode definir o valor de teste para a qualquer coisa que você quiser. Assim, você poderá definir o storyboard para começar quando seu valor muda para falso. Você pode adicionar tantos DataTriggers (ou outros gatilhos), como você deseja.
Observe que no meu exemplo I referência a uma propriedade manequim e storyboard.
Quando as alterações de propriedade, a ligação será atualizado e irá disparar o gatilho por causa da ligação de dados.
Esta técnica também deve trabalhar na inicialização.
Outras dicas
Assim como o cartaz acima, eu também usou um DataTrigger e depois ligou-o a uma propriedade em meu ViewModel. A única coisa que eu achei confundindo foi onde colocar o gatilho de dados. Eu colocá-lo directamente no nó raiz (isto é janela). Eu criei-lo usando Expression Blend, que cuidou dos detalhes tag de nomenclatura para mim.
Certifique-se também incluir em seu projeto uma referência a "Microsoft.Expression.Interactions"
XAML: (este vai diretamente no nó de raiz)
<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>
ViewModel:
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));
}
}
Finalmente, o ViewModel deve herdar "INotifyPropertyChanged"