WPF-混淆DataTrigger/DoubleAnimation行为
我正在尝试根据绑定到我的WPF-混淆DataTrigger/DoubleAnimation行为,wpf,datatrigger,layouttransform,Wpf,Datatrigger,Layouttransform,我正在尝试根据绑定到我的ViewModel类上的布尔值的DataTrigger来设置layoututtransform属性的ScaleY动画。当值第一次被DataTrigger(应用程序第一次启动时)看到为false时,以及当我在复选框的选中事件中将其第一次更改为true时,动画就会发生,但在同一复选框的未选中事件中将其设置为false时,动画就不会发生 下面列出了我正在做的事情的简化版本 ViewModel类非常简单,包含一个名为Selected的布尔DependencyProperty
ViewModel
类上的布尔值的DataTrigger
来设置layoututtransform
属性的ScaleY
动画。当值第一次被DataTrigger
(应用程序第一次启动时)看到为false时,以及当我在复选框的选中事件中将其第一次更改为true时,动画就会发生,但在同一复选框的未选中事件中将其设置为false时,动画就不会发生
下面列出了我正在做的事情的简化版本
ViewModel类非常简单,包含一个名为Selected的布尔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));
}
窗口.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>
我知道当属性为false时,DataTrigger
会触发,因为如果我将DoubleAnimation
更改为在Opacity
属性上操作的简单Setter
,那么我会看到正确的结果。因此,我如何使用DoubleAnimation
似乎是个问题
任何帮助都是值得的。这是一种奇怪的行为,但我决定将“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>
这正是我们想要的。我不知道这两种情况之间有什么区别,但至少这是一个答案。这是一种奇怪的行为,但我决定将“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>
这正是我们想要的。我不知道这两种情况之间有什么区别,但至少这是一个答案。这确实很奇怪。有人知道为什么会这样吗?真奇怪。有人知道为什么会这样吗?