2009-02-05 10 views
2

J'ai utilisé l'événement BitmapImage.DownloadProgress pour attendre que l'image soit chargée lors de la création d'un bitmap à partir d'un URI. C'est-à-dire que je peux utiliser un gestionnaire d'événements pour vérifier Image.ActualWidth/ActualHeight une fois le téléchargement terminé. Cela fonctionne bien.Silverlight: Obtenir une image (à partir d'OpenFileDialog) largeur/hauteur

Mais lorsque je charge une image que l'utilisateur a sélectionnée sur son ordinateur, DownloadProgress est inutile.

Cela fonctionne pour les bitmaps URI:

private void LoadImage(Uri uri) 
{ 
    this.ResetProgressImage(); 
    BitmapImage image = new BitmapImage();    
    image.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(LoadImageDownloadProgress); 
    image.UriSource = uri; 
    this.ImageFull.Source = image; 
} 

private void LoadImageDownloadProgress(object sender, DownloadProgressEventArgs e) 
{ 
    this.Dispatcher.BeginInvoke(delegate 
    { 
     this.ProgressImage.Value = e.Progress; 
     if (e.Progress == 100) 
     { 
      ImageHelper.Current.Width = Math.Round(this.ImageFull.ActualWidth); 
      ImageHelper.Current.Height = Math.Round(this.ImageFull.ActualHeight); 
     } 
    }); 
} 

Mais cela ne fonctionne pas lors de l'obtention d'un BitmapImage d'un flux:

private void LoadImage(Stream stream) 
{ 
    this.ResetProgressImage(); 
    BitmapImage image = new BitmapImage();    
    image.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(LoadImageDownloadProgress);    
    image.SetSource(stream); 
    this.ImageFull.Source = image; 
} 

Est-ce que quelqu'un sait une alternative à downloadProgress, lors de l'utilisation SetSource (courant)?

+0

Veuillez voter la bonne réponse. – BenMaddox

Répondre

2

Il n'y a aucun événement dans BitmapImage pour surveiller la progression du chargement à l'aide d'un flux. Toutefois, si vous avez seulement besoin des dimensions de l'image, vous pouvez ajouter l'image à la hiérarchie et attendre l'événement "Loaded" ou "LayoutUpdated".

+0

Merci BC, C'était une bonne idée. Cela fonctionne, mais vous devez vous rappeler de supprimer EventHandler après son utilisation, sinon mon événement se déclenchait pour d'autres changements de disposition. Pendant que j'attendais une réponse, par la solution était de créer un Thread and Thread.Sleep (200) séparé et puis appelez ma méthode, cela a fonctionné aussi, mais a semblé un peu comme un hack. Merci de votre aide! Findel –

Questions connexes