J'essaye d'animer la propriété ScaleY
d'un LayoutTransform
basé sur un DataTrigger
lié à un booléen sur ma classe ViewModel
. L'animation se produit lorsque la valeur est d'abord faussée par le DataTrigger
(lorsque l'application démarre pour la première fois) et lorsque je l'ai modifiée pour la première fois dans un événement coché d'une case, mais pas lorsque je la mets à false dans l'événement non coché de cette case.WPF - Confondre comportement DataTrigger/DoubleAnimation
Une version simplifiée de ce que je fais est listée ci-dessous.
La classe ViewModel est très simple, contenant un seul booléen DependencyProperty
appelé Selected.
public class VM : DependencyObject
{
public bool Selected
{
get { return (bool)GetValue(SelectedProperty); }
set { SetValue(SelectedProperty, value); }
}
// Using a DependencyProperty as the backing store for Selected. This enables animation, styling, binding, etc...
public static readonly DependencyProperty SelectedProperty =
DependencyProperty.Register("Selected", typeof(bool), typeof(VM), new UIPropertyMetadata(false));
}
Le Window.xaml
contient un bouton et une case à cocher. Lorsque la case est cochée, je place la propriété 'Selected' de ViewModel sur true et false lorsqu'elle n'est pas cochée. Voici le code du xaml et du code-behind.
<Window x:Class="DataTriggers.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:y="clr-namespace:DataTriggers"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<y:VM x:Key="VM"/>
<Style TargetType="Button" x:Key="but">
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="False">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1"
To="0"
Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Selected}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1"
To="1"
Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<Button Style="{StaticResource but}" DataContext="{StaticResource VM}">
<Button.LayoutTransform>
<ScaleTransform></ScaleTransform>
</Button.LayoutTransform>
me
</Button>
<CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</StackPanel>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
VM vm = this.FindResource("VM") as VM;
vm.Selected = true;
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
VM vm = this.FindResource("VM") as VM;
vm.Selected = false;
}
}
Je sais que les DataTrigger
se déclenche lorsque la propriété est fausse parce que si je change le DoubleAnimation
à un Setter
simple, fonctionnant sur la propriété Opacity
alors je vois les résultats corrects. Donc, il semble que ce soit un problème avec la façon dont j'utilise le DoubleAnimation
.
Toute aide serait appriciée.
C'est vraiment étrange. Est-ce que quelqu'un sait pourquoi c'est comme ça? – lbergnehr