2009-03-12 10 views
0

Ich versuche, die ScaleY Eigenschaft eines LayoutTransform basierend zu animieren auf einem DataTrigger zu einem boolean auf meine ViewModel Klasse gebunden. Die Animation tritt auf, wenn der Wert zuerst von der DataTrigger (beim ersten Start der Anwendung) als falsch erkannt wird und wenn ich ihn zuerst in einem aktivierten Checkbox-Kontrollkästchen auf true ändere, aber nicht, wenn ich ihn im selben deaktivierten Kontrollkästchen auf false setze.WPF - Verwirrende Datatrigger/Double Verhalten

Eine vereinfachte Version von dem, was ich tue, ist unten aufgeführt.

Die ViewModel-Klasse ist sehr einfach und enthält einen einzelnen booleschen DependencyProperty namens 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)); 
} 

Die Window.xaml enthält einen Knopf und ein Kontrollkästchen. Wenn das Kontrollkästchen aktiviert ist, setze ich die Eigenschaft "Ausgewählt" des ViewModels auf "true" und "false", wenn es nicht markiert ist. Hier ist der Code für das Xaml und sein 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; 
    } 
} 

Ich weiß, dass die DataTrigger wird ausgelöst, wenn die Eigenschaft, weil falsch ist, wenn ich die DoubleAnimation auf einen einfachen Setter Betrieb auf der Opacity Eigenschaft ändern dann sehe ich die richtigen Ergebnisse. Es scheint also ein Problem damit zu sein, wie ich die DoubleAnimation benutze.

Jede Hilfe würde geschätzt werden.

Antwort

3

Dies ist ein merkwürdiges Verhalten, aber ich beschlossen, die ‚False‘ Fall in die wie folgt ExitActions des Datatrigger Refactoring -

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

Das wie vorgesehen funktioniert. Ich weiß nicht, was der Unterschied zwischen den beiden Fällen ist, aber es ist zumindest eine Antwort.

+1

Das ist in der Tat seltsam. Weiß jemand, warum es so ist? – lbergnehr