WPF - 令人困惑的 DataTrigger/DoubleAnimation 行为

Eig*_*ite 1 wpf datatrigger layouttransform

我正在尝试根据我班级上布尔值的绑定来为 a的ScaleY属性设置动画。当值第一次被(应用程序首次启动时)视为 false时,当我第一次在复选框的选中事件中将其更改为 true时,动画发生,但当我在同一个复选框的未选中事件中将其设置为 false 时,不会发生动画。LayoutTransformDataTriggerViewModelDataTrigger

下面列出了我正在做的事情的简化版本。

ViewModel 类非常简单,包含一个DependencyProperty名为 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));
}
Run Code Online (Sandbox Code Playgroud)

Window.xaml包含一个按钮和一个复选框。当复选框被选中时,当它被取消选中时,我将 ViewModel 的“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>
Run Code Online (Sandbox Code Playgroud)

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道DataTrigger当属性为 false 时会触发,因为如果我将属性更改DoubleAnimation为简单的Setter操作,Opacity那么我会看到正确的结果。所以这似乎是我如何使用DoubleAnimation.

任何帮助将被appriciated。

Eig*_*ite 5

这是 ODD 行为,但我决定将“False”案例重构为 DataTrigger 的 ExitActions,如下所示 -

<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>
Run Code Online (Sandbox Code Playgroud)

这按预期工作。我不知道这两种情况有什么区别,但至少这是一个答案。