如何通过父控件中的事件为子控件设置动画? - 可重复使用的方式

时间:2013-02-11 09:39:27

标签: c# wpf animation controls

我有一个DockPanel和一个Button。我想在停靠面板中按事件(例如,鼠标悬停)设置按钮的动画(例如,淡入/淡出)。

修改

好吧,我发现解决方案仅适用于非模板/非模式情况(见下文)。如何以可重用的方式使用它?

<DockPanel>
  <Button> 
    Name="aaa"
  </Button>

  <DockPanel.Triggers>
    <EventTrigger RoutedEvent="DockPanel.MouseEnter">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation 
            Duration="0:0:0.100" 
            To="1" 
            Storyboard.TargetName="aaa"
            Storyboard.TargetProperty="Opacity"/>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
    <EventTrigger RoutedEvent="DockPanel.MouseLeave">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimation 
            Duration="0:0:0.100" 
            To="0" 
            Storyboard.TargetName="aaa"
            Storyboard.TargetProperty="Opacity"/>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>    
  </DockPanel.Triggers>

</DockPanel>

1 个答案:

答案 0 :(得分:1)

嗯,我唯一的想法就是将Controls包裹在ContentControl中。然后,您可能只需要为ContentControl创建模板。

修改

ContentPresenter =&gt; ContentControl

EDIT2

根据 TO 的编辑:

如果你想采用一种方法来处理事件,这是一种适当但恕我直言不太优雅的方法,你必须在视图后面的代码中实现这些方法。 e.g。

private void OnMouseOver(object sender, MouseEventArgs e)
{
  var control = sender as Control; // perhaps you could cast to another base class
  if (control == null)
    return;
  // implement the behavior you like
  // ...
}

最大的问题,恕我直言的原因不那么优雅,你必须添加和删除每个Control的方法,这个方法被添加到后面代码中的DockPanel。

如果您不熟悉模板,那么对您来说可能是更好的解决方案。