2009-11-14 5 views
3
ui

J'ai cette classe:mise à jour Silverlight fil croix question

public class UploadFile : INotifyPropertyChanged { 
    private string name; 
    public string Name { 
     get { 
      return name; 
     } 
     set { 
      name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    private FileInfo fileInfo; 
    public FileInfo FileInfo { get; set; } 

    private string length; 
    public string Length { 
     get { 
      return length; 
     } 
     set { 
      length = value; 
      OnPropertyChanged("Length"); 
     } 
    } 

    private int percentage; 
    public int Percentage { 
     get { 
      return percentage; 
     } 
     set { 
      percentage = value; 
      OnPropertyChanged("Percentage"); 
     } 
    } 

    public string ProgressValue { 
     get { return string.Format("{0}%", Percentage); } 
    } 

    private string imageSource; 
    public string ImageSource { 
     get { 
      return imageSource; 
     } 
     set { 
      imageSource = value; 
      OnPropertyChanged("ImageSource"); 
     } 
    } 


    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 

    private void OnPropertyChanged(string property) { 
     if (PropertyChanged != null) { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 

Je suis en train de créer un transfert de fichier qui est capable de le téléchargement de fichiers volumineux et multiples. Je fais cela en utilisant un service web. J'ai fait une liaison bidirectionnelle dans mon interface utilisateur et maintenant je veux télécharger les fichiers. Je le fais en utilisant ce code

private void DoUpload() { 
     foreach (UploadFile file in fileInfos){ 
      int BUFFERSIZE = 1024; 
      int offset = 0; //get from webservice, when partial file 
      FileStream s = file.FileInfo.OpenRead(); 
      byte[] buffer = null; 
      long remainingBytes = s.Length - offset; 
      while (remainingBytes > 0) { 
       if (remainingBytes < BUFFERSIZE) { 
        buffer = new byte[remainingBytes]; 
        BUFFERSIZE = (int)remainingBytes; 
       } 
       else if (remainingBytes > BUFFERSIZE) { 
        buffer = new byte[BUFFERSIZE]; 
       } 

       s.Read(buffer, 0, BUFFERSIZE); 
       //push to webservice 
       Thread.Sleep(20); 
       //UploadService.Service1SoapClient client = new MultiLargeFileUpload.UploadService.Service1SoapClient(); 
       //client.LargeUploadCompleted +=new EventHandler<AsyncCompletedEventArgs>(client_LargeUploadCompleted); 
       //client.LargeUploadAsync(1, buffer, file.Name); 
       offset += BUFFERSIZE; 
       int newPercentage = offset/(int)file.FileInfo.Length * 100; 
       file.Percentage = newPercentage; 
       remainingBytes = s.Length - offset;      
      } 
      //file.Percentage = 100; 
      //file.ImageSource = "accept.png"; 
     } 
    } 

Le problème est que je ne peux pas mettre à jour l'interface utilisateur, ou le fonctionnement croisé. J'ai essayé d'utiliser un Dispatcher, mais je n'ai pas réussi parce que je ne savais pas où l'insérer.

Répondre

5

Je suppose que vous essayez de faire la mise à jour de l'interface utilisateur dans

  file.Percentage = newPercentage; 
      remainingBytes = s.Length - offset; 

Vous allez devoir conclure cela dans un délégué, et faire un Dispatcher.BeginInvoke sur cette mise à jour de votre interface utilisateur d'un autre fil:

Dispatcher.BeginInvoke(()=>{ 
    file.Percentage=newPercentage; 
    remainingBytes = s.Length - offset; 
}); 

de cette façon, vous envoyez un message à MessageQueue sur le thread principal et le thread principal peut exécuter le délégué quand il a le temps.

Questions connexes