【发布时间】:2010-04-29 20:24:04
【问题描述】:
我正在尝试根据我的 ViewModel 中的属性更改创建一个简单的(我认为)动画效果。我希望目标是自定义控件的控件模板中的特定文本块,它继承自 Window。
从我看到的文章示例中,DataTrigger 是完成此任务的最简单方法。 Window.Triggers 似乎不支持 DataTriggers,这导致我尝试在样式中应用触发器。我目前遇到的问题是我似乎无法定位 TextBlock(或任何其他子控件)——下面的代码是将动画应用于整个窗口的背景。
如果我完全离开 StoryBoard.Target,效果完全一样。
这是使用错误语法的正确方法,还是有更简单的方法来完成此操作?
<Style x:Key="MyWindowStyle" TargetType="{x:Type Window}">
<Setter Property="Template" Value="{StaticResource MyWindowTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ChangeOccurred}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard BeginTime="00:00:00" Duration="0:0:2" Storyboard.Target="{Binding RelativeSource={RelativeSource AncestorType=TextBlock}}"
Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)">
<ColorAnimation FillBehavior="Stop" From="Black" To="Red" Duration="0:0:0.5" AutoReverse="True"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
更新
还应该提到我尝试命名 TextBlock 并通过 StoryBoard.TargetName 引用它(正如 Timores 建议的那样),并收到错误“TargetName 属性无法在样式设置器上设置。”
【问题讨论】:
-
您想要的动画目标到底是什么?您说“自定义控件的控件模板中的特定文本块”,然后为
Window而不是自定义控件创建样式。你能提供包含你的动画目标的代码吗?上面的目标绑定不应该工作,因为我不希望 Window 有一个 TextBlock 类型的祖先,是吗?!这可能吗? -
抱歉,这是一个难以描述的设置。自定义控件是一个窗口,因为它派生自 window。设置/样式是由其他人创建的,所以我正在尝试改造这个动画。 Textblock 是一个子控件——再看一遍,RelativeSource/AncestorType 可能还没有接近,因为我试图定位一个孩子而不是父母?
标签: wpf data-binding animation