2012-10-05 3 views
0

J'essaye de récupérer des images de la bibliothèque de médias à un panneau de chaîne dans la liste 'lstImageFromMediaLibrary', essaye également que pendant que les images chargent montrent un écran de chargement using un usercontrol et l'ajoutent à popup.child mais j'obtiens ceci exceeption 'UnauthorizedAccessException' quand je supprimer tout le code lié backgrougWorker pas un tel accès non autorisé est là ....pourquoi est-ce que je reçois .UnauthorizedAccessException?

 void backroungWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 

     foreach (Picture p in mediaLibrary.Pictures) 
     { 

      bitmapImage.SetSource(p.GetThumbnail()); 
      lstBitmapImage.Add(bitmapImage); 
     } 


     this.lstImageFromMediaLibrary.ItemsSource = lstBitmapImage; 
    } 

toute aide est appriciated, je l'espère, je me suis fait clair ....

EDIT: ok donc maintenant m faire

BackgroundWorker backroungWorker = new BackgroundWorker(); 
    Popup popup = new Popup(); 
    public PanoramaPage1() 
    { 

     InitializeComponent(); 

     showpopup(); 
     init(); 
    } 

    private void init() 
    { 
     backroungWorker.WorkerReportsProgress = true; 
     backroungWorker.DoWork += new DoWorkEventHandler(backroungWorker_DoWork); 
     backroungWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backroungWorker_RunWorkerCompleted); 
     backroungWorker.ProgressChanged+=new ProgressChangedEventHandler(backroungWorker_ProgressChanged); 
     backroungWorker.RunWorkerAsync(); 
    } 
    void backroungWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     this.Dispatcher.BeginInvoke(() => 
     { 
      popup.IsOpen = false; 
     } 
     ); 
    } 
    void backroungWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     backroungWorker.ReportProgress(10); 

    } 
    void backroungWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     this.InitializePage(); 
    } 


    private void showpopup() 
    { 

     popup.Child = new SplashScreenControl(); 
     popup.Width = 480; 
     popup.IsOpen = true; 

    } 

    private void InitializePage() 
    { 

     MediaLibrary mediaLibrary = new MediaLibrary(); 
     List<BitmapImage> lstBitmapImage = new List<BitmapImage>(); 
     foreach (Picture p in mediaLibrary.Pictures) 
     { 
      BitmapImage bitmapImage = new BitmapImage(); 
      bitmapImage.SetSource(p.GetThumbnail()); 
      lstBitmapImage.Add(bitmapImage); 
     } 


     this.lstImageFromMediaLibrary.ItemsSource = lstBitmapImage; 
    } 

mais la barre de progression montre juste un point et rien d'autre .....

Répondre

3

Vous accédez à l'interface utilisateur dans votre DoWork événement. Vous devez communiquer avec votre application via les événements de travail en arrière-plan tels que ProgressChanged ou les événements RunWorkerCompleted.

De premier lien:

Vous devez faire attention à ne pas manipuler les objets de l'interface utilisateur dans votre gestionnaire d'événements DoWork. Au lieu de cela, communiquez avec l'interface utilisateur via les événements BackgroundWorker.

+0

je suis désolé, mais pouvez-vous s'il vous plaît expliquer un peu plus .... je suis nouveau ici relativly – goldsmit409

+0

@aadilsiddiqui En regardant le code que vous avez ajouté, vous faites votre travail dans le ProgressChanged événement qui est sur le même thread comme application, vous ne recevez aucun avantage de votre arrière-plan. Ce que vous devez faire est ** Faites tout ** de votre travail dans votre événement «DoWork», puis assignez votre lstBitmapImage au 'e.Result' de' DoWork', il sera disponible dans le 'RunWorkerCompleted' Events e.Result dans un formulaire utilisable. Vous utiliserez ensuite l'événement ProgressChanged pour incrémenter votre barre de progression en fonction de la quantité de votre bibliothèque multimédia que vous avez traitée. –

+0

merci je l'ai fait mais j'ai utilisé Dispatcher.BeginInvoke ..... – goldsmit409

Questions connexes