2

给定由 VisualStateManager 作为 ControlTemplate 的一部分启动的 Storyboard,我将如何根据控件的属性更改调整该动画的 SpeedRatio?

<ControlTemplate>
  <Grid>
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup>
        <VisualState>
          <Storyboard Name="SpinningThing"
                      SpeedRatio="{Binding SpinningSpeedRatio}">
            ...

这需要在 WPF 和 Silverlight 中都有效。

由于多种原因,我认为我不能在那里设置绑定。最重要的是,Storyboard 是可冻结的,因此您不能在 WPF 中随意设置 SpeedRatio。但是,如果它是由 VisualStateManager 启动的,我可以在它上面调用 SetSpeedRatio 吗?

此外,由于它的父级是 VisualState,这是否意味着没有与之相关的管理 FrameworkElement ?

那么,如果我不能用绑定来做到这一点,怎么能做到呢?

4

3 回答 3

1

对于那些来到这里寻找 UWP 解决方案的人,您可以{x:Bind}在 a 的SpeedRatio属性上使用a Storyboard,它确实可以动态地改变您所期望的速度比。

<Storyboard SpeedRatio="{x:Bind ViewModel.SpinningSpeedRatio, Mode=OneWay}">

编辑:一个警告是您需要确保在 上设置比率UIThread,否则它将被VisualStateManager. 仍然会Storyboard播放,但不会以您设置的速度播放。

于 2021-12-16T07:08:42.497 回答
0

通常您会使用 {TemplateBinding...} 而不是 {Binding...},但这仅适用于简单、兼容的类型。

您还应该能够使用“相对绑定源”绑定到模板化控件。如果类型不匹配,这也允许您使用值转换器。

SpeedRation={Binding SomeProperty, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource SomeConverter}}" 

我没有在 WPF 中对此进行测试,但 Silverlight 通常是功能受限的。

于 2010-08-18T19:41:36.990 回答
0

好吧,看起来确实没有办法通过绑定来严格处理这个问题。因此,为了解决这个问题,我在代码隐藏中挂钩了事件,以根据需要启动/调整动画。

于 2010-09-27T17:29:41.050 回答