IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Wpf/C# Bloquer interaction GUI pendant animation


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Par défaut Wpf/C# Bloquer interaction GUI pendant animation
    Bonjour à tous,

    voilà, je recherche déjà depuis un petit moment comment bloquer les interactions de l'utilisateur avec l'interface (GUI) pendant que celle-ci est en train d'exécuter une animation.

    J'ai mis en place dans mon logiciel un gestionnaire de pages, avec lequel je peux switcher les pages de l'interface. Voici les animations mises en place lors d'un changement de page.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    pages[pageNumber].BeginAnimation(Control.OpacityProperty, null);
    pages[pageNumber].Opacity = 0;
    pages[pageNumber].Visibility = Visibility.Visible;
    pages[pageNumber].RenderTransform = new ScaleTransform();
    pages[pageNumber].RenderTransformOrigin = new Point(0.5, 0.5);
     
    DoubleAnimation fadeAnimate = new DoubleAnimation();
    fadeAnimate.To = 1;
    fadeAnimate.Duration = new Duration(TimeSpan.FromSeconds(1));    
    pages[pageNumber].BeginAnimation(Control.OpacityProperty, fadeAnimate);
     
    ScaleTransform scaleTransform = (ScaleTransform)pages[pageNumber].RenderTransform;
    DoubleAnimation scaleAnimate = new DoubleAnimation();
    scaleAnimate.Duration = new Duration(TimeSpan.FromSeconds(1));
    scaleAnimate.To = 1;
    scaleAnimate.From = 0.9;
    scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, scaleAnimate);
    scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimate);
    Mais voilà, l'animation se déroule, mais si malencontreusement le client double clic sur un bouton, il se peut que le bouton de la page suivante, se trouvant au même endroit soit cliqué.

    Alors, j'aimerai pouvoir bloquer l'interaction de mon interface pendant que les animations se déroulent. Avez vous une proposition à me soumettre?

    J'ai déjà testé de désactiver (pages[pageNumber].isEnable = false) les pages juste avant l'animation et le réactiver après avoir lancé l'animation, mais c'était sans compter qu'une animation est non bloquante.

    Merci d'avance à ceux qui pourront me répondre, et à ceux qui m'auront lu.

  2. #2
    Membre averti
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Par défaut
    Bonjour à tous,

    je me permets un petit up afin de voir si vous n'avez pas trouver d'idées?

    J'ai cherché de mon coté sans trouver de moyen de bloquer l'interaction du client avec le logiciel pendant un laps de temps, et que les clics pendant ce moment là, ne soit pas exécuter au déblocage.

    Avec vous au pire un moyen d'annuler le traitement des clics de souris?

    Merci d'avances à tous.

  3. #3
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Ce que tu pourrais faire si vraiment tu ne veux/peux pas te servir du IsEnabled, c'es transformer ton interface en Bitmap (VisualBrush), afficher le bitmap sous forme d'image et cacher la veritable interface, le temps de ton animation.

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 38
    Par défaut
    Ajouter un adorner qui est enfaite un rectangle transparent ??

    un truc du genre
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class VoileAdorner : Adorner
        {
            public VoileAdorner(UIElement adornedElement)
                : base(adornedElement)
            {
            }
     
            protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
            {
                Rect surface = new Rect(AdornedElement.RenderSize);
                SolidColorBrush color = new SolidColorBrush(Colors.Transparent);
                drawingContext.DrawRectangle(color, null, surface);
            }
        }

    avec par défaut une Visibility Collapsed et durant l'animation une visibilité Visible.

    ps: je n'ai pas testé mais je pense que sa devrait faire l'affaire.

  5. #5
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    oui mais un voile ne règle pas les problèmes de focus (entrée clavier) et donc une action est toujours possible sur les controles en cours d'animation.

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    En winforms, j'aurais essayé de mettre dans ma forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    internal bool Blocked_by_Animation= false ; //  mettre à true pendant l'animation
    ...
    protected override void WndProc(ref Message msg)
     {
       if (!Blocked_by_Animation)  base.WndProc(ref msg);
     }
    }
    En WPF, il semble qu'on puisse faire quequeschose de semblable avec HwndSource
    Voir : http://www.steverands.com/2009/03/19...proc-wpf-apps/

  7. #7
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Hum sympa ça, je le mets dans un coin de ma tête

  8. #8
    Membre averti
    Inscrit en
    Février 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 13
    Par défaut
    Bonjour,

    désolé de répondre si tard, j'ai été très pris par mon travail.

    Premièrement je tiens à vous remercier de vos idées qui sont très intéressantes.

    J' ai pensé hier soir à la solution de "rectangle invisible au premier plan" proposée par nemesisTHEone pour empêcher d'interagir avec ma fenêtre. Cette solution étant correcte dans le cadre de mon projet car le logiciel est embarqué sur un IPC (ordinateur avec écran tactile) ou il n'est possible de connecté de clavier.

    Il est sûr qu'elle n'est pas très esthétique mais d'une grande simplicité à mettre en oeuvre.

    L'idée proposée par Graffito me semble aussi très intéressante. Je vais creuser de ce coté là voir si j'arrive à implémenter un système du genre mais légèrement modifier.

    Un dernier point, je te remercie grandement Graffito pour ton lien. Pourquoi? Car j'avais lancé, il y a quelques temps, des recherches sur le sujet EXACTE de ton lien. Pour finir, j'avais trouvé une solution alternative à celle proposé dans le lien (ouvrir une windows forms à partir de l'application WPF afin de détecter une clé USB) . Mais celle là me semble plus propre.

    Un grand merci à ceux qui ont participé à cette discussion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 53
    Dernier message: 05/06/2014, 19h42
  2. Bloquer une fenètre pendant chargement
    Par donnadieujulien dans le forum Débuter
    Réponses: 1
    Dernier message: 22/06/2008, 15h36
  3. Réponses: 16
    Dernier message: 01/06/2007, 09h30
  4. [Conception] Comment faire pour bloquer une valeur pendant 24H
    Par lolodelp dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/07/2006, 15h46
  5. Bloquer une form pendant un chargement
    Par eponette dans le forum Delphi
    Réponses: 7
    Dernier message: 20/06/2006, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo