按钮事件的目标窗口故事板(声音太简单了)

时间:2014-10-20 12:01:45

标签: c# wpf xaml animation

我有复杂的动画,必须在启动时运行,每次鼠标离开按钮时(我有很多按钮)

<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"/>

我该怎么办?我的目标是拥有按钮样式(在窗口资源中定义),但是我有问题从子控件事件触发器中触发窗口触发器中的故事板。

1 个答案:

答案 0 :(得分:1)

我知道你有很多按钮。因此Storyboard中的Window.Triggers应该用于所有按钮(加载窗口时动画一次)。但是Storyboard需要一个特定的目标,你怎么能为所有按钮设置它?我们只能复制代码并按名称对每个代码进行定位。这是第一个问题。

尝试解决第一个问题时出现第二个问题。将所有SeekStoryboardPauseStoryboard,...放置在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>