DataTrigger似乎没有激发

时间:2012-06-08 11:40:39

标签: wpf datatrigger coloranimation

我想创建一个使我的页面闪烁的数据触发器(从透明变为红色)。所以我创建了一个DataTrigger,它在我的viewmodel中监听一个布尔标志。该标志应指示何时需要提醒用户。在这种情况下,我的页面将从透明变为红色。

我很确定我已经以正确的方式实现了数据触发器,但我的应用程序什么也没做 - 没有错误,没有闪烁......所以我必须错过一些东西。

<Style x:Key="ReminderPage" TargetType="{x:Type ViewTemplates:TpApplicationBarView}" BasedOn="{StaticResource TpApplicationBarViewStyle}">
    <Style.Triggers>

        <!-- Reminder animation, when the time comes to remind the user -->
        <DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard x:Name="Blink">
                        <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" 
                                        AutoReverse="True" 
                                        From="Transparent" 
                                        To="Red" 
                                        Duration="0:0:1" 
                                        RepeatBehavior="Forever">
                        </ColorAnimation >
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>

        <DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="False">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" 
                                        AutoReverse="False" 
                                        To="Transparent" 
                                        Duration="0:0:1">
                        </ColorAnimation >
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

那么,我做错了什么?

更新:我可以在输出窗口中看到以下消息:

System.Windows.Media.Animation Warning: 6 : Unable to perform action because 
the specified Storyboard was never applied to this object for interactive control.;        
Action='Stop'; Storyboard='System.Windows.Media.Animation.Storyboard'; 
Storyboard.HashCode='61356140'; Storyboard.Type='System.Windows.Media.Animation.Storyboard'; 
TargetElement='System.Windows.Media.Animation.Storyboard'; TargetElement.HashCode='61356140'; 
TargetElement.Type='System.Windows.Media.Animation.Storyboard'

Update2:在谷歌搜索后我发现,这是UI线程的一个问题。所以每当我设置绑定属性时,我都会调度调度程序。但即便有这个技巧,也没有彩色动画。但是输出窗口中的错误似乎消失了。所以,我正在寻找有关如何修复动画的进一步想法。

Update3:设置页面的背景颜色似乎是一般问题。但这真的很奇怪。页面放在NavigationFrame中。设置导航框的背景颜色将改变应用程序的颜色,但设置页面的背景颜色(即使没有任何动画)也不会改变任何内容。

2 个答案:

答案 0 :(得分:0)

我认为你必须设置动画目标,类似这样 -

Storyboard.TargetName="yourWindowName"

您可能已经检查了这一点,但请确保将正确的对象设置为TpApplicationBarView的DataContext(具有IndicateReminderAnimation属性)。

答案 1 :(得分:0)

我发现了这个错误 - 或者更好的是两个错误。

1。)似乎无法更改放置在导航框架内的页面的背景颜色。

首先是将绑定和事件移动到MainWindow本身(wpf窗口类)

2.。)包含数据触发器的样式不起作用。在谷歌搜索后,我找到了一个可行的解决方案,用于我正在寻找的东西。

<Storyboard x:Key="RemindUser" >
    <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" 
                    AutoReverse="True" 
                    From="Transparent" 
                    To="{StaticResource WinAccentBackgroundColor}" 
                    Duration="0:0:1" 
                    RepeatBehavior="Forever">
    </ColorAnimation >
</Storyboard>

<Storyboard x:Key="StopRemindUser">
    <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)" 
                    AutoReverse="True" 
                    To="Transparent" 
                    Duration="0:0:1">
    </ColorAnimation >
</Storyboard>

<Style x:Key="ReminderWindow" TargetType="{x:Type Metro:SnappedTransparentWindow}" BasedOn="{StaticResource TransparentWindow}">
    <Style.Triggers>

        <!-- Reminder animation, when the time comes to remind the user -->
        <DataTrigger Binding="{Binding IndicateReminderAnimation}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource RemindUser}"/>
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <BeginStoryboard Storyboard="{StaticResource StopRemindUser}"/>
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

关键是将绑定和故事板分成不同的部分。