2009-03-12 2 views
0

Я пытаюсь анимировать свойство ScaleYLayoutTransform на основе DataTrigger, связанного с булевым классом ViewModel. Анимация происходит, когда значение сначала считается ложным DataTrigger (когда приложение сначала запускается), и когда я сначала меняю его на true в отмеченном флажком флажке, но не тогда, когда я установил его в false в том же флажковом флажке.WPF - Confusing DataTrigger/DoubleAnimation поведение

Ниже приведена упрощенная версия того, что я делаю.

Класс ViewModel очень прост, содержит один логический DependencyProperty, называемый выбранным.

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)); 
} 

Window.xaml содержит кнопку и флажок. Когда флажок установлен, я устанавливаю свойство SelectedModel 'Selected' равным true и false, когда он не установлен. Вот код как для xaml, так и для кода.

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

Я знаю, что DataTrigger пожары, когда свойство является ложным, потому что если я изменить DoubleAnimation к простому Setter работает на Opacity собственности, то я вижу правильные результаты. Так что, похоже, проблема в том, как я использую DoubleAnimation.

Любая помощь будет назначена.

ответ

3

Это странное поведение, но я решил реорганизовать «False» дело в ExitActions в 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> 

Это работает как задумано. Я не знаю, какая разница между этими двумя случаями, но, по крайней мере, это ответ.

+1

Это действительно странно. Кто-нибудь знает, почему это так? – lbergnehr

 Смежные вопросы

  • Нет связанных вопросов^_^