我在使用WPF的DataTriggers时遇到了问题,当绑定的属性“快速”更改时,动画无法正常工作。该动画是一个元素的简单闪烁。我的问题是,即使我在互联网上搜索了很长时间,也找不到解释为什么在连续两行中切换属性的开/关状态不起作用,但如果线程休眠1毫秒,就可以正常工作。我尝试插入其他指令来“浪费”一些时间,但这也不起作用。
以下是ViewModel中涉及的属性:
以下是ViewModel中涉及的属性:
private bool m_activateFlash;
public bool ActivateFlash
{
get { return m_activateFlash; }
set
{
SetPropertyBackingField(ref m_activateFlash, value);
}
}
以下是XAML代码:
<DataTemplate x:Key="JobTemplate" DataType="viewModel:JobViewModel">
<Border Margin="8,4,8,4" BorderThickness="1" BorderBrush="{StaticResource BorderBrush}" Background="{StaticResource JobBackgroundBrush}">
<Border.Resources>
<Storyboard x:Key="Blink">
<ColorAnimation Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" FillBehavior="Stop"
Duration="0:0:0.4" To="{StaticResource JobBackgroundFlash}" RepeatBehavior="3x" AutoReverse="True"/>
</Storyboard>
</Border.Resources>
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding ActivateFlash, NotifyOnTargetUpdated=True}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Blink}" Name="BeginBlinkStoryBoard"/>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
[....]
最后,这就是在ViewModel中导致问题的地方:
private void TriggerFlash()
{
ActivateFlash = true;
System.Threading.Thread.Sleep(1); // HACK DOESN'T WORK WITHOUT THIS LINE
ActivateFlash = false;
}
我查看了EventTriggers,可能是绕过问题的一种方式,但我认为DataTrigger是实现我想要的逻辑方式。非常感谢任何帮助 :)
编辑似乎我没有在主线程上调用触发器。简单地调用 Dispatcher.Invoke(...) 解决了这个问题。
谢谢
Adam