我目前正在使用MVVM Light为Surface平台(.NET 4.0)开发C#游戏。我正在寻找一种方法将动态PointAnimations(翻译)合并到一个MVVM项目中(或者发现它不可能)。我不是MVVM纯粹主义者,但如果能够适应MVVM,那就更好了。
在视觉上我正在尝试将ScatterViewItem自动转换为ScatterView上的另一个位置。用户按下Surface上的按钮后,将计算新位置。
我使用过RelayCommands,知道Messenger和RaisePropertyChanged事件的不同用途,但我无法弄清楚动画的去向。构建它们的数据在ViewModel中,但显然动画将在View中播放。所以如果可能的话,我不知道哪些部分应该去哪里,或者我应该以某种方式在ViewModel中构建它们,然后将列表发送到View?
我只看过基于XAML的动画加上MVVM Light(Laurent Bugnion的MIX11演示/样本)。所以也许我犯了MVVM-heresy,在这种情况下我可能不得不放弃MVVM。
在我的非MVVM卫星项目中,我正在使用以下代码,这非常有效:
private void btnStartAnimation_Click(object sender, RoutedEventArgs e)
{
PointAnimation oPointAnimation;
oPointAnimation = new PointAnimation();
oPointAnimation.From = new Point(GreenOne.ActualCenter.X, GreenOne.ActualCenter.Y);
oPointAnimation.To = new Point(GreenOne.ActualCenter.X + 300, GreenOne.ActualCenter.Y);
oPointAnimation.FillBehavior = FillBehavior.HoldEnd;
oPointAnimation.Duration = TimeSpan.FromSeconds(1);
oPointAnimation.Completed += new EventHandler(OnAnimation_Completed);
GreenOne.BeginAnimation(ScatterViewItem.CenterProperty, oPointAnimation,HandoffBehavior.SnapshotAndReplace);
}
//make it hold its position and make it movable again
private void OnAnimation_Completed(object sender, EventArgs e)
{
Point center = GreenOne.ActualCenter;
GreenOne.BeginAnimation(ScatterViewItem.CenterProperty, null);
GreenOne.Center = center;
}