我有复杂的动画,必须在启动时运行,每次鼠标离开按钮时(我有很多按钮)
<Window.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard x:Name="storyboard">
<Storyboard>
...
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<!-- I have to do this for every button -->
<EventTrigger RoutedEvent="MouseEnter" SourceName="button1">
<SeekStoryboard BeginStoryboardName="storyboard" Offset="0"/>
<PauseStoryboard BeginStoryboardName="storyboard"/>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave" SourceName="button1">
<ResumeStoryboard BeginStoryboardName="storyboard"/>
</EventTrigger>
</Window.Triggers>
我只重复使用Loaded
中播放的动画,而不是创建新的动画,这就是Seek..
,Pause..
和ResumeStoryboard
的原因。
一切正常,但有很多重复的代码。
我开始考虑为按钮设置样式以避免WET xaml编码。起初,我试过这个(只是为了看看是否好)
<Button x:Name="button1">
<Button.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<SeekStoryboard BeginStoryboardName="storyboard" Offset="0"/>
...
我出现异常并不奇怪
System.Windows.Media.Animation警告:6:无法执行操作,因为指定的Storyboard从未应用于此对象以进行交互式控制。行动=“寻求”;故事板= 'System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode = '56868664'; Storyboard.Type = 'System.Windows.Media.Animation.Storyboard'; TargetElement = 'System.Windows.Controls.Button'; TargetElement.HashCode = '23765798'; TargetElement.Type = 'System.Windows.Controls.Button'
我觉得它应该与Storyboard.Target...
有关,但是尝试给出窗口名称会产生同样的错误
<Window x:Name="window"
...
<SeekStoryboard BeginStoryboardName="storyboard" Offset="0" Storyboard.TargetName="window"/>
我该怎么办?我的目标是拥有按钮样式(在窗口资源中定义),但是我有问题从子控件事件触发器中触发窗口触发器中的故事板。
答案 0 :(得分:1)
我知道你有很多按钮。因此Storyboard
中的Window.Triggers
应该用于所有按钮(加载窗口时动画一次)。但是Storyboard
需要一个特定的目标,你怎么能为所有按钮设置它?我们只能复制代码并按名称对每个代码进行定位。这是第一个问题。
尝试解决第一个问题时出现第二个问题。将所有SeekStoryboard
,PauseStoryboard
,...放置在Button的样式中时,它无法在样式范围中找到Storyboard
的名称。这意味着解决此问题的唯一方法是将Storyboard
放在Button的样式内。但是我们无法在Window.Triggers
内轻松访问此故事板。但是,要解决第一个问题,我们也不应将Storyboard
置于Window.Triggers
范围内。我们为什么不在Button Storyboard
时触发Loaded
?然后我们可以将所有内容放在Button的样式中。以下代码应解决您的所有问题:
<Window.Resources>
<Storyboard x:Key="sb">
<!-- more code here ... -->
</Storyboard>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility,
RelativeSource={RelativeSource AncestorType=Window},
Mode=OneTime}" Value="Visible">
<DataTrigger.EnterActions>
<StaticResource ResourceKey="beginSb"/>
</DataTrigger.EnterActions>
</DataTrigger>
<EventTrigger RoutedEvent="MouseEnter">
<SeekStoryboard BeginStoryboardName="storyboard" Offset="0"/>
<PauseStoryboard BeginStoryboardName="storyboard"/>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<ResumeStoryboard BeginStoryboardName="storyboard"/>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>