12
votes

Comment attendre que l'état change de transition pour terminer à Silverlight 4?

Je dois changer l'état d'un contrôle et ensuite faire une action. Pour être spécifique, je veux exécuter une animation avant que le contrôle soit caché. Je voudrais faire quelque chose comme ça:

VisualStateManager.GoToState(control, "Hidden", true); // wait until the transition animation is finished
ParentControl.Children.Remove(control);


2 commentaires

Cela fonctionne aussi dans WPF. Merci pour le poste, c'est exactement ce que je cherchais!


Toute façon que cela puisse être fait dans mvvm?


3 Réponses :


14
votes

Vous pouvez joindre un gestionnaire d'événements de scénario.Commande au storyboard ou joindre un gestionnaire d'événements VisualStateGroup.CurrentStatChanged à la vue VisualStateGroup:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication7
{
public partial class MainPage : UserControl
{
    public MainPage()
    {
        // Required to initialize variables
        InitializeComponent();

        this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    }

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        VisualStateManager.GoToState(this, "Hidden", true);
    }

    private void OnHidden(object storyboard, EventArgs args)
    {

    }
}


2 commentaires

C'était la seule solution qui me vint à l'esprit. Mais cela ne semble pas très gentil et propre pour moi. :-( D'autre part, s'il n'y a pas d'autre solution, je n'aurai aucun choix. Je vous remercie.


Mais que si nous utilisons le contrôle personnalisé? Dans ce cas, il n'est pas possible d'ajouter du gestionnaire dans XAML.



3
votes

La bonne façon de manipuler ce problème n'échapperait à l'événement CurrentStatCHanged sur VisualStateGroup, mais de mon expérience, il n'est pas fiable au mieux et cassé au pire.

La deuxième option consiste à accrocher l'événement terminé sur votre storyboard, mais cette option a eu ses propres pièges. Dans certains cas, Visual State Manager génère des animations en interne, un événement complété que vous avez défini ne sera pas appelé.


0 commentaires

3
votes

Il est en fait possible de joindre le gestionnaire rempli dans le code: xxx

exemple de ce thread: http://forums.silverlight.net/forums/p/38027/276746.aspx

Travailler pour moi dans le projet en direct en utilisant Comportement ci-joint aussi! Légèrement gênant que je devais utiliser des propriétés de dépendance distinctes pour la racine Usercontrol (à utiliser dans VisualStatManager.Gotostate) et layoutrooot pour obtenir la collection VisualStateGroup actuelle.


0 commentaires