.net 如何使用MVVM在WPF中实现球移动动画?
我正在尝试使用WPF制作简单的动画。我有使用ItemTemplateSelector绘制的带有球的画布 这是DataTemplate的示例.net 如何使用MVVM在WPF中实现球移动动画?,.net,wpf,animation,mvvm,.net,Wpf,Animation,Mvvm,我正在尝试使用WPF制作简单的动画。我有使用ItemTemplateSelector绘制的带有球的画布 这是DataTemplate的示例 <DataTemplate x:Key="CellWithBall"> <Canvas> <Rectangle Canvas.Left="{Binding Path=Position.x}" Canvas.Top="{Binding Path=Position.y}"
<DataTemplate x:Key="CellWithBall">
<Canvas>
<Rectangle Canvas.Left="{Binding Path=Position.x}" Canvas.Top="{Binding Path=Position.y}"
Fill="{Binding Path=BallColour}" Width="{Binding Path=Size}" Height="{Binding Path=Size}"
Stroke="Black" StrokeThickness="0.1">
<Rectangle.InputBindings>
<MouseBinding Gesture="LeftClick"
Command="{Binding Path=DataContext.ClickedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding}" />
</Rectangle.InputBindings>
</Rectangle>
</Canvas>
</DataTemplate>
当“移动球”事件触发时,模型发送到视图模型路径。路径是球必须通过的点的列表。示例:球在操场单元0中绘制;0表示视图模型中的属性位置设置为0;0然后我们要把球移到第1单元;1.逻辑获取如下路径{0;0,0;1,1;1}
如何在不破坏MVVM实现的情况下实现这种动画?如何传递路径以查看?任何想法都将受到赞赏 如果您使用的是MVVM,我假设您在某处有一个ViewModelVM。现在,让我们称之为“CellAnimatorVM”。无论如何,假设您的ItemsView将位于窗口中,您希望将该窗口的DataContext设置为您的CellAnimatorVM类
<Window.DataContext>
<local:CellAnimatorVM/>
</Window.DataContext>
这会让你上钩的
仅供参考:INotifyPropertyChanged的简单实现如下:
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
#endregion
你为什么要强迫别人做一些本该帮你的事?我不明白为什么这么多人如此努力地坚持使用mvvm,只是制作非常复杂的东西。。。MVVM是一个帮助,一个指南,如果它适合你,就坚持它,在最好的地方打破它。对于您的问题,请在自定义控件中处理动画,您的viewmodel将被通知或用于检索重要数据。动画通常应仅依赖于视图,但如果必要,请再次打断它:Curtis,你说得对。这是我真正的密码。VM是DataContext和OnPropertyChaneged,用于更新视图。但问题在于动画。我只是从来没有做过动画。只是最简单的任务。所以我不知道该使用什么控件或其他什么@DOWHILEFO建议创建自定义控件。好主意很快就会尝试。那么,您是只是自动移动单元格,还是根据用户单击的内容移动单元格?如果要自动移动它们,WPF会内置动画。如果在用户单击某个对象时移动它,那么您仍然可以使用WPF在一段时间内从点A到点B设置动画,并且它会这样做。这里有一个关于如何制作动画的博客链接。
private Position _position;
public Position Position
{
get{ return _position;}
set
{
_position = value;
OnPropertyChanged("Position");
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
#endregion