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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Membre averti
    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
    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 : 39
    Localisation : France, Paris (Île de France)

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

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

  4. #4
    Membre averti
    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
    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
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 056
    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
    Membre averti
    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
    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

+ 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