2009-03-12 5 views
0

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.

Répondre

3

Ce comportement est ODD mais j'ai décidé de remanier le « Faux » dans les cas comme celui-ci ExitActions du DataTrigger -

<DataTrigger Binding="{Binding Selected}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Duration="0:0:1" 
              To="1" 
              Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
       <DataTrigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Duration="0:0:1" 
              To="0" 
              Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.ExitActions> 
      </DataTrigger> 

Cela fonctionne comme prévu. Je ne sais pas quelle est la différence entre les deux cas, mais au moins c'est une réponse.

+1

C'est vraiment étrange. Est-ce que quelqu'un sait pourquoi c'est comme ça? – lbergnehr

Questions connexes