WPF动画在“快速”属性更改时无法正常工作

4
我在使用WPF的DataTriggers时遇到了问题,当绑定的属性“快速”更改时,动画无法正常工作。该动画是一个元素的简单闪烁。我的问题是,即使我在互联网上搜索了很长时间,也找不到解释为什么在连续两行中切换属性的开/关状态不起作用,但如果线程休眠1毫秒,就可以正常工作。我尝试插入其他指令来“浪费”一些时间,但这也不起作用。
以下是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


1
@Clemens 我敢打赌他在后台线程上调用了TriggerFlash。如果他在UI线程上,这个hack就不会起作用 :/ - user1228
你是对的。我在从次线程调用TriggerFlash时忘了调用调度程序 -.- - Picnic8
1个回答

5

如果您执行以下操作:

ActiveFlash = true;
ActiveFlash = false;

您不会看到屏幕上的任何内容,因为界面在主线程上,还没有时间进行绘制就已经更改了值。 切换值发生得非常快,因此您不会在屏幕上看到任何内容。
我认为并且如果我错了,有人可以纠正我,但我认为WPF会在后台批量重绘以提高性能,因此您只是在自己的步伐中越过了自己。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接