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 :

BusyIndicator en WPF / MVVM : mode asynchrone


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut BusyIndicator en WPF / MVVM : mode asynchrone
    Bonjour à tous,

    Quelques traitements dans mon application prenne quelques secondes, voir quelques minutes.

    J'ai donc voulu utiliser le toolkit BusyIndicator.

    voici le code du côté xaml de ma mainWindows :
    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    xmlns:extToolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit.Extended"
    (...)
     <extToolkit:BusyIndicator IsBusy="{Binding BI}" >
                       <TabControl x:FieldModifier="public" Margin="0,29,0,23" Name="tabControl2" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Tabs}" SelectedIndex="{Binding TabSelect}"  Background="#00000000">
            </TabControl>
            </extToolkit:BusyIndicator>

    VOici le code de mon viewModel :
    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
    16
    17
    18
    19
     
    BackgroundWorker worker = new BackgroundWorker();
                worker.DoWork += (o, ea) =>
                {
     
                    Application.Current.Dispatcher.BeginInvoke((Action)(() =>
                        NewTabItem("LSP", "Liste des Portefeuilles")
                        ));
                };
     
                worker.RunWorkerCompleted += (o, ea) =>
                {
                    _BI = false;
                    RaisePropertyChanged("BI");
                 };
     
                _BI = true;
                RaisePropertyChanged("BI");
                worker.RunWorkerAsync();


    Malheureusement le BusyIndicator ne s'affiche jamais.

    Je pense que j'ai un problème d'appel asynchrone de mon busyIndicator pour Isbusy=true.
    Car si j'enlève toute la partie worker, j'arrive bien à afficher mon Busyindicator

    Comment forcer l'affichage du BusyIndicator de manière asynchrone svp?

    (Pour info, la fonction que j'execute sur le thread a pour objectif d'ajouter un tabItem au tabControl et le content de ce tabItem est un USerControl qui dans son init fait quelques requête en base données, est-ce que j'ai mis au bon endroit mon busyIndicator?)


    Merci de votre aide.

    cdt

    Mickeybond

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Bon alors, après plusieurs essais, j'arrrive à faire fonctionner mon busyIndicator.

    Je laisse mon busyIndicator au niveau de ma MainWindow, par contre ma fonction de thread je l'utilise dans mon usercontrol et j'envoi un messenger à la main pour afficher ou fermer le busyindicator.

    et dans ce cas la .. ça fonctionne correctement

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Comment est définie ta propriété BI ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private bool _BI 
    public bool BI
            {
                get
                {
                    return _BI;
                }
                set
                {
                    _BI = value;
                    RaisePropertyChanged("BI");
                }
            }

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 030
    Points : 5 476
    Points
    5 476
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
               worker.RunWorkerCompleted += (o, ea) =>
                {
                    BI = false;
                 };
    Si t'as défini une propriété alors utilise là, sinon elle ne sert à rien.
    En plus ca allège ton code.
    Sinon le problème est toujours là ou pas?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Merci Micka132, effectivement c'est plus simple d'utiliser la propriété.

    Concernant mon problème a évolué.
    J'ai laissé dans mon MainWindows le BusyIndicator.

    et dans mon user control qui s'affiche dans un tabitem de la mainWindows j'ai ajouté ce code.

    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
    20
    21
     
    BackgroundWorker worker = new BackgroundWorker();
                worker.DoWork += (o, ea) =>
                {
                    VisuData VD = new VisuData();
                    _dataSP = VD.visuTGSP();
                    Application.Current.Dispatcher.Invoke((Action)(() =>
                          Suiteinitializeload()
                          ));
                };
     
                worker.RunWorkerCompleted += (o, ea) =>
                {
                    Messenger.Default.Send<string, MainViewModel>("NO");
                    //_BI = false;
                    //RaisePropertyChanged("BI");
                };
     
                Messenger.Default.Send<string, MainViewModel>("YES");
     
                worker.RunWorkerAsync();
    Dans la mainWindows j'ai associé au messenger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Messenger.Default.Register<String>(this, delegate(String msg)
                {
    if (msg == "YES")
                    {
                        BI = true;
                    }
                    if (msg == "NO")
                    {
     
                        BI = false;
    Jusqu'à la aucun problème. Mon busyIndicator s'affiche bien et à la fin du traitement il disparait bien, sauf que (malheureusement) si j'ai plus de 2 onglet sur tabControl, tous les onglets pairs sont désactivés (2°,4°, 6° etc ...).
    Je ne comprend pas pourquoi.

    J'ai beau ajouté une fonction : tabItem.ISEnabled= true, rien ne change

    Merci de votre aide

    cdt

    Mickeybond

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Hum.... Je ne vois pas le rapport en ton BusyIndicator et l'activation/désactivation des onglets de ton TabControl....

    Tu es sur de nous montrer tout ton code ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Bonjour à tous

    Dsl de répondre aussi tard ...
    Oui j'ai bien montré tout mon code ...

    La solution pour éviter mon problème est tout simple :

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <extToolkit:BusyIndicator IsBusy="{Binding BI}" >
    </extToolkit:BusyIndicator>
     
    <TabControl x:FieldModifier="public" Margin="0,29,0,23" Name="tabControl2" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Tabs}" SelectedIndex="{Binding TabSelect}"  Background="#00000000">
            </TabControl>

    au lieu d'entourer mon tabControl par mon busyIndicator ... je le met seul et la plus aucun pb.

    Je ne m'explique toujours pas le pb des onglets désactivés, mais ça marche

    merci à tous pour votre aide précieuse

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

Discussions similaires

  1. télécharger fichier en mode asynchrone
    Par crocodile dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 29/01/2010, 15h39
  2. Ecrire un fichier en mode asynchrone
    Par sivaller dans le forum Windows
    Réponses: 1
    Dernier message: 03/11/2009, 10h22
  3. Réponses: 17
    Dernier message: 01/09/2008, 15h23
  4. Réponses: 1
    Dernier message: 15/02/2008, 18h40
  5. [.NET] Une question technique a propos du mode asynchrone
    Par nicknolt dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/06/2004, 10h07

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