按钮事件的目标窗口情节提要(听起来太简单了,是的)

本文关键字:简单 听起来 是的 目标 事件 窗口 按钮 | 更新日期: 2023-09-27 18:27:13

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

<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:无法执行操作,因为指定的情节提要从未应用到此对象以进行交互式控制。;行动="一周";情节提要='System.Windows.Media.Manimation.Storyboard';Storyboard.HashCode='56868664';情节提要.Type='System.Windows.Media.Manimation.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"/>

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

按钮事件的目标窗口情节提要(听起来太简单了,是的)

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

第二个问题出现在试图解决第一个问题时。当放置所有SeekStoryboardPauseStoryboard。。。在Button的Style中,它在Style作用域中找不到Storyboard的名称。这意味着解决这个问题的唯一方法是将Storyboard放置在Button的Style中。但是,我们无法在Window.Triggers中轻松访问这个故事板。然而,为了解决第一个问题,我们也不应该将Storyboard放在Window.Triggers范围内。为什么我们不在按钮的Loaded时触发Storyboard?然后我们可以将所有内容都放在按钮样式中。以下代码应该可以解决您的所有问题:

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