2017-01-26 2 views
0

J'essaie de comprendre comment déclencher une animation à partir de mon viewmodel dans mon application MVVM Xamarin Forms en utilisant le cadre de lumière MVVM sans écraser mon application.déclencher une animation sur le bouton de presse

J'ai appris que les animations n'appartiennent pas au viewmodel et j'ai donc déplacé cette logique vers la vue.

Lorsqu'un bouton est enfoncé (lié à une commande dans mon viewmodel), j'envoie un message de mon viewmodel à ma vue pour déclencher l'animation.

code viewmodel:

public class GamePageViewModel : ViewModelBase 
{ 
    private readonly IDialogService _dialogService; 

    public ICommand NextRoundCommand 
    { 
     get 
     { 
      return new RelayCommand(() => 
      { 
       NextButtonEnabled = false; 
       _game.MoveToNextRound(); 
       UpdateOnScreenText(); 
       NextButtonEnabled = true; 
      },()=> false); 
     } 
    } 

    private bool _nextButtonEnabled = false; 
    public bool NextButtonEnabled 
    { 
     get { return _nextButtonEnabled; } 
     set 
     { 
      _nextButtonEnabled = value; 
      RaisePropertyChanged(()=>NextButtonEnabled); 
     } 
    } 

    private void UpdateOnScreenText() 
    { 
     Messenger.Default.Send(new StartEnlargeAnimationMessage()); 
     Item1Text = _game.CurrentRound.OpenCards[0].Name; 
    } 
} 

Dans le code derrière de mon avis de XAML J'ai une méthode qui exécute l'animation.

Afficher le code:

public partial class GamePage : ContentPage 
{ 
    public GamePage(GamePageViewModel gamePageViewModel) 
    { 
     BindingContext = gamePageViewModel; 
     InitializeComponent(); 

     Messenger.Default.Register<StartEnlargeAnimationMessage>(this, PlayEnlargeAnimation); 
    } 

    //private bool playingAnimation = false; 
    private async void PlayEnlargeAnimation(StartEnlargeAnimationMessage message) 
    { 
     await RoundLabel.ScaleTo(2, 500, Easing.CubicIn); 
     await RoundLabel.ScaleTo(1, 500, Easing.CubicIn); 
    } 

Cela fonctionne un peu. Le problème est que lorsqu'un utilisateur appuie deux fois sur le bouton (rapide, dans l'animation active), j'obtiens une erreur "Une tentative a été faite pour faire passer une tâche à un état final quand elle était déjà terminée."

Ce problème semble être un problème connu depuis plusieurs mois mais n'est pas encore résolu (https://bugzilla.xamarin.com/show_bug.cgi?id=41016).

Comme suggéré dans les commentaires de ce bugreport les moyens que j'ai essayé de contourner cela est d'essayer de cacher/désactiver le bouton, mais pas encore trouvé une façon réussie de le faire. J'ai également essayé d'appeler l'animation de manière synchrone.

Si vous avez un aperçu de la façon de résoudre ce scénario, il serait grandement apprécié.

Mon (encore faible) codebase se trouve ici: https://github.com/sjorsmiltenburg/Cyclades.Shuffler/tree/develop

Répondre

0

hmm .. apparemment, je regardais dans mon ancien code émulateur. J'ai dû désinstaller le programme sur mon émulateur pour qu'il soit actualisé. Après avoir fait cela, désactiver/activer les boutons pendant l'animation a résolu mon problème. Bien que je suis toujours déçu que cela pourrait planter l'application.