He estado tratando de descubrir cómo activar de manera efectiva las animaciones en una vista cuando se actualiza una propiedad en ViewModel, donde la animación depende del valor de dicha propiedad.Animaciones de vista dinámica usando MVVM
He recreado mi problema en una aplicación simple con una sola Vista y un Modelo de Vista. El objetivo aquí es hacer la transición del cambio de color de un rectángulo utilizando una Animación de color. Como referencia, he estado usando el paquete MVVM Foundation de Josh Smith.
El proyecto de ejemplo puede ser downloaded here.
En resumen, quiero animar la transición de color en la vista siempre que cambia la propiedad de color.
MainWindow.xaml
<Window x:Class="MVVM.ColorAnimation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ColorAnimation="clr-namespace:MVVM.ColorAnimation" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ColorAnimation:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Rectangle Margin="10">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Color}"/>
</Rectangle.Fill>
</Rectangle>
<StackPanel Orientation="Horizontal" Grid.Row="1">
<Button Command="{Binding BlueCommand}" Width="100">Blue</Button>
<Button Command="{Binding GreenCommand}" Width="100">Green</Button>
</StackPanel>
</Grid>
</Window>
MainWindowViewModel.cs
namespace MVVM.ColorAnimation
{
using System.Windows.Input;
using System.Windows.Media;
using MVVM;
public class MainWindowViewModel : ObservableObject
{
private ICommand blueCommand;
private ICommand greenCommand;
public ICommand BlueCommand
{
get
{
return this.blueCommand ?? (this.blueCommand = new RelayCommand(this.TurnBlue));
}
}
private void TurnBlue()
{
this.Color = Colors.Blue;
}
public ICommand GreenCommand
{
get
{
return this.greenCommand ?? (this.greenCommand = new RelayCommand(this.TurnGreen));
}
}
private void TurnGreen()
{
this.Color = Colors.Green;
}
private Color color = Colors.Red;
public Color Color
{
get
{
return this.color;
}
set
{
this.color = value;
RaisePropertyChanged("Color");
}
}
}
}
¿Hay alguna forma de la vista para desencadenar una ColorAnimation en lugar de una transición instantánea entre los valores? La forma en que estoy haciendo esto actualmente es otra aplicación bastante desordenada, en la que establezco ViewModel a través de una propiedad ViewModel
, y luego uso un PropertyObserver para supervisar los cambios de valores, luego creo la animación y la desencadeno desde el código subyacente:
this.colorObserver = new PropertyObserver<Player>(value)
.RegisterHandler(n => n.Color, this.CreateColorAnimation);
En una situación en la que estoy lidiando con muchos colores y muchas animaciones potenciales, esto se convierte en un desastre, y arruina el hecho de que estoy pasando manualmente el ViewModel a la Vista, simplemente vinculando los dos a través de un ResourceDictionary. Supongo que podría hacer esto en el evento DataContextChanged
también, pero ¿hay una mejor manera?
El enlace al proyecto ya no es válido. – itsho