【问题标题】:How to: animate a MVVM ViewModel property in Silverlight 4?如何:在 Silverlight 4 中为 MVVM ViewModel 属性设置动画?
【发布时间】:2011-04-18 23:38:09
【问题描述】:

我想问一下,如果可能的话,您如何在 Silverlight 中为 MVVM 视图模型上的属性设置动画。例如,这里我在 XAML 中有一个典型的 Storyboard 声明:

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

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

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

当然,Storyboard 上没有这样的“BindingSource”属性,但这应该有助于说明我想要做什么。

Silverlight 4 中是否有任何机制来完成为 MVVM 视图模型属性设置动画的任务,而无需在代码隐藏中添加代码?

【问题讨论】:

    标签: silverlight-4.0 mvvm


    【解决方案1】:

    是的。你可以这样做。

    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 声明?
    • 设置属性 Target 时,出现以下错误:错误 1 ​​XML 命名空间 'schemas.microsoft.com/winfx/2006/xaml/presentation' 中的类型 'DoubleAnimation' 上不存在属性 'Target'。
    • 添加了另一种绑定方式。动画可能非常敏感,因此您可能必须尝试不同的技术才能获得实际的视图模型。
    • 感谢莱思提供的信息。感谢您的尝试,因此我赞成您的回答。不幸的是,我正在寻找一个优雅的解决方案,它完全按照指定的方式工作,而不是摆弄或涉及绑定到其他 UIElements 的黑客来完成这项工作。
    猜你喜欢
    • 2011-05-11
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2011-03-31
    相关资源
    最近更新 更多