1

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

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

<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 中。设置导航框架的背景颜色会改变应用程序的颜色,但是设置页面的背景颜色(即使没有任何动画)不会改变任何东西。

4

2 回答 2

0

我认为你将不得不设置动画目标,像这样 -

Storyboard.TargetName="yourWindowName"

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

于 2012-06-08T12:18:17.663 回答
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>

关键是将装订和故事板分成不同的部分。

于 2012-06-08T13:25:41.107 回答