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

Silverlight Discussion :

utiliser un busyIndicator lors d'un upload [MVVM]


Sujet :

Silverlight

  1. #1
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut utiliser un busyIndicator lors d'un upload
    Bonjour à tous,
    Je n'arrive pas à trouver l'astuce !

    J'ai une page sur laquelle j'ai un bouton d'upload.

    L'idée est d'afficher un busyIndicator lorsque l'upload commence.

    J'ai tenté différentes approches (code Behind, binding MVVM, messenger) sans résultat. J'ai toujours le même soucis. Le statut du busyIndicator ne change pas au moment ou je lance l'upload (Busy.IsBusy=true juste après le test sur le showDialog() de l'openFileDIalog).

    Quelqu'un aurait-il une piste de recherche ?

    Merci d'avance,
    Frédéric

    Ci-après le 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     private void button1_Click(object sender, RoutedEventArgs e)
     
            {
     
                this.textBlock2.Text = string.Empty;
     
                OpenFileDialog openFIleDialog = new OpenFileDialog();
     
                openFIleDialog.Filter = "All Image Files ( JPEG,GIF,BMP,PNG)|*.jpg;*.jpeg;*.gif;*.bmp;*.png|JPEG Files ( *.jpg;*.jpeg )|*.jpg;*.jpeg|GIF Files ( *.gif )|*.gif|BMP Files ( *.bmp )|*.bmp|PNG Files ( *.png )|*.png";
     
                openFIleDialog.FilterIndex = 1;
     
                openFIleDialog.Multiselect = false;
     
                string str = string.Empty;
     
                if (openFIleDialog.ShowDialog() == true)
     
                {
                    Busy.IsBusy = true;
     
                    foreach (var file in openFIleDialog.Files)
     
                    {
     
                        using (Stream fileStream = GetFileData(file.OpenRead()))
     
                        {
                            // sequence resizing
                            DecodedJpeg origJpeg = new JpegDecoder(fileStream).Decode();
     
                            if (ImageResizer.ResizeNeeded(origJpeg.Image, 1024))
                            {
                                //resize de l'image
                                DecodedJpeg resizedJpeg = new DecodedJpeg(new ImageResizer(origJpeg.Image).Resize(1024, ResamplingFilters.NearestNeighbor), origJpeg.MetaHeaders);
                                //Encodage de resized image                
                                MemoryStream resizedStream = new MemoryStream();
                                new JpegEncoder(resizedJpeg, 100, resizedStream).Encode();
                                //Read resized stream to byte array                
                                //resizedStream.Seek(0, SeekOrigin.Begin);
                                StreamResourceInfo streamResourceFile = new StreamResourceInfo(resizedStream, null);
                                byte[] data = new byte[streamResourceFile.Stream.Length];
                                //resizedStream.Read(data, 0, Convert.ToInt32(resizedStream.Length));
                                streamResourceFile.Stream.Read(data, 0, (int)streamResourceFile.Stream.Length);
                                str = Convert.ToBase64String(data);
                            }
                            else
                            {
                                //Read original stream to byte array                
                                fileStream.Seek(0, SeekOrigin.Begin);
                                //data = new byte[fileStream.Length];
                                StreamResourceInfo streamResourceFile = new StreamResourceInfo(fileStream, null);
                                byte[] data = new byte[streamResourceFile.Stream.Length];
                                fileStream.Read(data, 0, Convert.ToInt32(fileStream.Length));
                                streamResourceFile.Stream.Read(data, 0, (int)streamResourceFile.Stream.Length);
                                str = Convert.ToBase64String(data);
                            }
     
     
     
     
     
                            WebClient oWebClient = new WebClient();
     
                            string fileName = Guid.NewGuid().ToString().Replace("-", "") + file.Extension;
     
                            oWebClient.UploadStringAsync(new Uri("http://localhost:49377/Uploader.ashx?file=" + fileName), null, str, fileName);
     
                            oWebClient.UploadProgressChanged += new UploadProgressChangedEventHandler(oWebClient_UploadtxtProgressChanged);
     
                            totalFilesToUpload += 1;
     
                            str = string.Empty;
     
     
                        }
     
                    }
     
                }
     
            }
     
            System.IO.MemoryStream GetFileData(System.IO.Stream oFileStream)
     
            {
     
                oFileStream.Seek(0, System.IO.SeekOrigin.Begin);
     
                byte[] data = new byte[oFileStream.Length];
     
                oFileStream.Read(data, 0, (int)oFileStream.Length);
     
                return new System.IO.MemoryStream(data);
     
            }
     
            void oWebClient_UploadtxtProgressChanged(object sender, UploadProgressChangedEventArgs e)
     
            {
     
                totalFilesUploaded += 1;
     
                textBlock2.Text = !string.IsNullOrEmpty(textBlock2.Text) ? (int.Parse(textBlock2.Text) + e.BytesSent).ToString() : e.BytesSent.ToString();
     
                if (totalFilesUploaded == totalFilesToUpload)
     
                {             
     
                    textBlock2.Text = totalFilesUploaded + " files uploaded successfully (" + textBlock2.Text + " bytes sent )";
     
                }
                Busy.IsBusy = false;
     
            }

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Je vois que dans oWebClient_UploadtxtProgressChanged tu mets à false. Donc dès qu'il va passer dans cette méthode, il va se mettre à false. Et rester à false, vu que tu ne le remets jamais à true.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Bonsoir Olivier,
    Merci pour la réponse rapide.

    Cette méthode est appelée en fin de traitement.
    C'est justement par son biais que je stoppe le busyIndicator.

    J'ai tenté de la mettre en commentaires sans succès.
    J'ai bien la busyIndicator qui se place ... mais après la fin de l'upload de l'image.

    Mon problème se situe donc au niveau du premier changement d'état (passage à true).

    Il est réalisé au moment ou la fenêtre modale de sélection du fichier (générée par le showdialog) se ferme. On voit bien que l'instruction est prise en compte. Mais le busyIndicator ne s'active pas. :?

  4. #4
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Essaye en mettant l'upload (et du traitement de l'image) en backgroundworker. Sinon tu bloques probablement le thread UI => il ne met pas à jour le BusyIndicator.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  5. #5
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Bonjour Olivier,
    Je viens de regarder l'usage du backgroundworker.
    Je vais avoir le même soucis puisque l'upload se lance lorsque je clique sur le "ok" de la fenêtre modale du showdialog.
    Le traitement viendra se placer en background de la fenêtre modale (elle même dans son propre thread (j'imagine)). Je n'aurai donc toujours pas accès à mon UI et donc à la possibilité de modifier mon busyIndicator.

    C'est curieux qu'une telle fonction ait été oubliée, non ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    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 025
    Points : 5 462
    Points
    5 462
    Par défaut
    l'upload se lance lorsque je clique sur le "ok" de la fenêtre modale du showdialog.
    C'est justement le traitement de l'upload qui doit se faire par le background worker.
    En gros le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (openFIleDialog.ShowDialog() == true)
     
                {
                    Busy.IsBusy = true;
     
    backgroundWorker.DoWork();
    }
    ....
    Et en event de fin de backgroundWorker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Busy.IsBusy = false;
    ....
    Ton soucis est de passer la variable openFIleDialog.Files, je sais plus s'il y a une variable object, ou sinon tu passes par une variable de classe.

  7. #7
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Bonjour Mickael!

    Je suis justement en train d'essayer de résoudre ce soucis de passage de openFiledialog.files et je n'arrive pas à trouver la formulation ...

    Aurais-tu un exemple à me soumettre ??

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    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 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Il existe une méthode avec un paramètre object
    http://msdn.microsoft.com/en-us/libr...(v=vs.95).aspx
    .
    Il tu suffit d'appeler cette méthode avec ta collection de fileInfo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (openFIleDialog.ShowDialog() == true)
     
                {
                    Busy.IsBusy = true;
     
    backgroundWorker.RunWorkerAsync(openFIleDialog.Files);
    }
    Ensuite dans ton event backgroundWorker_DoWork(object sender, DoWorkEventArgs e)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
    IEnumerable<FileInfo> Files=(IEnumerable<FileInfo>) e.Argument;
     
     foreach (var file in Files)
     
                    {
     
                        using (Stream fileStream = GetFileData(file.OpenRead()))
    {.........
    }....
    }
     
    }
    Pour finir dans l'event de fin de background worker:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    Busy.IsBusy = false;
    .... 
    }

  9. #9
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    ça marche !!

    Un grand merci pour l'aide Mickael (et Olivier ... ).

    Bonne fin de journée !
    Frédéric

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/03/2013, 14h20
  2. [XML][FTP] caractère bizarre (ù à a place de é) lors d'un upload.
    Par d_token dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 27/09/2006, 12h18
  3. Réponses: 5
    Dernier message: 12/09/2006, 00h01
  4. [Upload] Erreur 'Action annulée' lors d'un upload
    Par SegmentationFault dans le forum Langage
    Réponses: 8
    Dernier message: 31/07/2006, 15h12
  5. Reduire la taille d'une image lors de son upload
    Par mael94420 dans le forum ASP
    Réponses: 1
    Dernier message: 19/06/2006, 20h27

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