【问题标题】:WPF "inherit" storyboardWPF“继承”故事板
【发布时间】:2014-11-08 21:42:20
【问题描述】:

我在 Resource-XAML(不透明度和渲染转换)中定义了一个故事板。现在我想在我不同的用户控件上使用它。由于这是一个淡入动画,因此在动画结束后开始用户控件的逻辑至关重要。 所以我知道情节提要的“已完成”事件,但我看不到如何在此处应用,因为我需要在使用动画的 UserControl 上定义 Eventhandler。 (有几个用户控件,每个用户控件在加载后都有自己的操作......)

样式有一个名为“BasedOn”的属性,在这里我可以定义父级...故事板对象也有类似的东西,还是我必须重新设计我的代码? 无论如何,如果有比通过 Resourcedictionary 更好地在项目中使用标准动画的方法,请告诉我。 提前致谢, 丹尼尔

编辑:

这里有部分resdic。

   <Storyboard  x:Key="ShowAndGrow">
    <DoubleAnimation Duration="0:0:0.3"
                     Storyboard.TargetProperty="RenderTransform.ScaleX"
                     To="1" />
    <DoubleAnimation Duration="0:0:0.3"
                     Storyboard.TargetProperty="RenderTransform.ScaleY"
                     To="1" />
    <DoubleAnimation Duration="0:0:0.1"
                     Storyboard.TargetProperty="Opacity"
                     To="1" />
</Storyboard>

我在用户控件中应用它

    <UserControl.Triggers>
    <EventTrigger RoutedEvent="FrameworkElement.Loaded">
        <BeginStoryboard Storyboard="{StaticResource ShowAndGrow}">                
        </BeginStoryboard>
    </EventTrigger>
</UserControl.Triggers>

这里我需要以某种方式添加已完成的事件....

【问题讨论】:

  • 在您的情况下,无法在代码隐藏而不是资源 XAML 中添加完成的事件?
  • 是否可以提供 XAML 示例和/或后面的适用代码,以便我们可以看到您已经拥有的内容? (例如 - 你在后面的代码中是否引用了动画?你是否使用 MVVM 方法 - 即当故事板在视图或视图模型中完成时将运行代码?)
  • 使用 WPF 时,经常会出现某些代码重复的情况,就像在这种情况下一样。但是,您可以Storyboard 存储在Resources 部分中,并以编程方式更改所有Storyboard.TargetProperty 值和Completed 事件处理程序。当然,如果您这样做了,那么您还必须以编程方式将其连接到每个 UserControlLoaded 事件,因为单独使用 XAML 是行不通的。
  • @Core-One:完全有可能,我只是想使用基础动画作为模板
  • @DavidEdey:我是 WPF 的新手,所以我不能告诉你我是否使用任何模式。 :) 当然我尝试拆分 UI 和业务逻辑... :)

标签: wpf xaml animation storyboard resourcedictionary


【解决方案1】:

所以我按照 Core-One 和 Sheridan 的建议,使用 findresource 在 Codebehind 中添加了故事板。我只是想知道,如果“正确”的方式是在 XAML 中尽可能多地定义,那么没有办法适应模板化动画...... 谢谢大家! BR, 丹尼尔

    Private Sub UserControl_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Dim sb As Storyboard = FindResource("ShowAndGrow")
    AddHandler sb.Completed, AddressOf StartAction
    sb.Begin(Me)
End Sub

【讨论】:

  • 我只是想知道,如果“正确”的方式是在 XAML 中尽可能多地定义...这就是我使用 WPF 的方式。很久很久以前,我放弃了尝试不复制任何代码,因为它通常不值得它造成的麻烦。
【解决方案2】:

您可以使用Resources 属性从Resources 集合中访问Storyboard

Storyboard storyboard = this.Resources["YourStoryboard"] as Storyboard;

但是,您确实需要访问DoubleAnimation 元素,因此您还需要命名它们。然后您就可以像这样重新分配目标属性:

Storyboard.SetTarget(YourDoubleAnimation, YourUiControl);
Storyboard.SetTargetProperty(YourDoubleAnimation, 
    new PropertyPath(Control.OpacityProperty));

您可以在 MSDN 上的 Working with Animations Programmatically 页面中找到更多示例(忽略它适用于 Silverlight 的事实,因为它在 WPF 中的工作方式相同)。

【讨论】:

  • 谢谢,就我而言,这实际上只是我必须“稍后”附加的事件。其余的都可以:)感谢您提供有用的链接。
猜你喜欢
  • 2017-11-22
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多