如何在Silverlight 4中为MVVM ViewModel属性添加动画效果?

3

我想问一下,在Silverlight中,如果可能的话,如何在MVVM视图模型上对属性进行动画处理。例如,这里有一个典型的XAML故事板声明:

  <DoubleAnimation
                    Storyboard.TargetName="yearSlider"
                    Storyboard.TargetProperty="Value"
                    From="1990" To="2012" Duration="0:0:8" />

假设我想要动画化MVVM视图模型上的CLR(非依赖)属性“Year”,而不是在Slider yearSlider上动画化Value属性。例如,如果我的视图模型设置为DataContext,则代码可能如下所示:

  <DoubleAnimation
                    Storyboard.BindingSource="{Binding}"
                    Storyboard.TargetProperty="Year"
                    From="1990" To="2012" Duration="0:0:8" />

当然,Storyboard没有“BindingSource”属性,但这可以帮助说明我的尝试。

在Silverlight 4中是否有机制可以完成此MVVM视图模型属性动画的任务,而不必诉诸于向代码后台添加代码?

1个回答

4

可以的。您可以这样做。

您的MVVM中的属性必须是一个依赖属性,而不是一个普通属性。因此,您的MVVM必须继承DependencyObject,然后您可以创建一个可以进行动画处理的依赖属性。

public class MyViewModel : DependencyObject
{
  public static readonly DependencyProperty YearProperty = 
    DependencyProperty.Register(
    "Year", typeof(int),
    typeof(MyViewModel), null
    );

  public int Year
  {
    get { return (int)GetValue(YearProperty); }
    set { SetValue(YearProperty, value); }
  }
}

然后你的XAML将如下所示:

<DoubleAnimation
   Storyboard.Target="{Binding}"
   Storyboard.TargetProperty="Year"
   From="1990" To="2012" Duration="0:0:8" />

试试这个,如果可以的话就告诉我。

如果不行,尝试调整一下直到你弄清如何使用DoubleAnimation满足绑定。也许你可以利用范围内的另一个元素:

<TextBlock x:Name="YearLabel" Text="{Binding Year}" />
<DoubleAnimation
   Storyboard.TargetName="YearLabel"
   Storyboard.TargetProperty="DataContext.Year"
   From="1990" To="2012" Duration="0:0:8" />

请注意我们正在修改“DataContext.Year”。它不一定是TextBlock。可以是任何带有名称的元素...例如RootLayout Grid。

你能展示一下XAML的样子吗?比如展示DoubleAnimation的声明? - T. Webster
当我设置Target属性时,出现以下错误:错误1 属性'Target'在XML命名空间'http://schemas.microsoft.com/winfx/2006/xaml/presentation'中的类型'DoubleAnimation'上不存在。 - T. Webster
添加了另一种绑定方式。动画可能会更加敏感,因此您可能需要尝试不同的技术来获取实际的视图模型。 - Laith
感谢您提供的信息,Laith。我很感激您的尝试,所以我已经为您的答案点赞了。不幸的是,我正在寻找一种优雅的解决方案,它可以完全按照规定的要求执行,而不是通过绑定其他UI元素来进行调整或者使用hack方法来实现。 - T. Webster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接