2010-01-09 3 views
1

Я новичок в Silverlight, и я создал приложение Silverlight для изменения размера и загрузки изображений. Проблема в том, что полоса прокрутки не обновляется, пока файл не завершит загрузку. Я включил пример кода функции PushData и обработчика событий. Пожалуйста, скажите мне, что я делаю неправильно, эта проблема сводит меня с ума.Silverlight 3 Progress Bar при загрузке файла

void btnTotalSizes_Click(object sender, RoutedEventArgs e) 
{ 
    // ... 
    UriBuilder ub = new UriBuilder("http://localhost:21636/FileReceiver.ashx"); 
    WebClient wc = new WebClient(); 
    wc.OpenWriteCompleted += (s2, e2) => 
    { 
     PushData(outStream, e2.Result); 
     e2.Result.Close(); 
     outStream.Close(); 
    }; 
    wc.OpenWriteAsync(ub.Uri); 
} 

private static void PushData(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[4096]; 
    int bytesRead = 0; 
    int tempTotal = 0; 

    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
     tempTotal += bytesRead; 
     _uploadProg++; 
     int percentDone = (int)(
      ((decimal)tempTotal/(decimal)input.Length) * 100); 
     ProgressUpdated(null, new UploadProgressChangedEventArgs(percentDone)); 
    } 
} 

void MainPage_ProgressUpdated(object sender, UploadProgressChangedEventArgs e) 
{ 
    progFileProg.Maximum = 100; 
    progFileProg.Value = e.ProgressPercentage; 
    sbUpdateProg.Begin(); 
} 
+0

Не нужно ли вызывать 'Dispatcher.BeginInvoke()'? –

ответ

1

Вам необходимо обработать событие WebClient.UploadProgressChanged.

Обработчик событий должен периодически обновляться. В обработчике обновите свой пользовательский интерфейс.

+0

Привет благодарю за ответ. Я попробовал событие UploadProgressChanged, но он никогда не срабатывает, даже если я вставил Thread.Sleep (10) внутри цикла PushData. Если вы считали, что событие, вероятно, было только когда вы использовали UploadStringAsync(). –

0

Мне удалось это сделать сейчас. Я сделал, чтобы использовать Dispatcher.BeginInvoke(), как прокомментировал Рубенс Фариас. Также мне пришлось добавить цикл загрузки в новый поток. Я предположил, что перед вызовом async будет новый поток, но я думаю, что нет.

public static event EventHandler UploadCompleted; 
     public static event ProgressChangedEvent ProgressUpdated; 

     public static int _fileLength; 
     public static int _uploadProg; 


     private List<FileInfo> _allSelectedFiles = new List<FileInfo>(); 


     public MainPage() 
     { 
      InitializeComponent(); 
      Loaded += new RoutedEventHandler(MainPage_Loaded); 

      btnAnimate.Click += new RoutedEventHandler(btnAnimate_Click); 
      btnTotalSizes.Click += new RoutedEventHandler(btnTotalSizes_Click); 
      ProgressUpdated += new ProgressChangedEvent(MainPage_ProgressUpdated); 
     } 

     void MainPage_ProgressUpdated(object sender, UploadProgressChangedEventArgs e) 
     { 
      Dispatcher.BeginInvoke(() => 
      { 
       progFileProg.Maximum = 100; 
       progFileProg.Value = _uploadProg; 
       sbUpdateProg.Begin(); 
      }); 
     } 


     void MainPage_Loaded(object sender, RoutedEventArgs e) 
     { 
     } 

     void btnTotalSizes_Click(object sender, RoutedEventArgs e) 
     { 
      foreach (FileInfo fi in _allSelectedFiles) 
      { 
       Stream fileStream = fi.OpenRead(); 


       //DecodedJpeg jpegIn = new JpegDecoder(fileStream).Decode(); 
       //DecodedJpeg jpegOut = new DecodedJpeg(
       // new ImageResizer(jpegIn.Image) 
       //  .Resize(1500, ResamplingFilters.NearestNeighbor), 
       // jpegIn.MetaHeaders); // Retain EXIF details 
       //MemoryStream outStream = new MemoryStream(); 
       //new JpegEncoder(jpegOut, 90, outStream).Encode(); 

       //outStream.Seek(0, SeekOrigin.Begin); 
       //outStream.Position = 0; 
       //UploadFile(fi.Name, outStream, "resources"); 

       UriBuilder ub = new UriBuilder("http://localhost:21636/FileReceiver.ashx"); 
       WebClient wc = new WebClient(); 

       //wc.UploadProgressChanged += (s2, e2) => 
       //{ 
       // ProgressUpdated(null, new UploadProgressChangedEventArgs(_uploadProg)); 
       //}; 



       wc.OpenWriteCompleted += (s2, e2) => 
       { 
        System.Threading.Thread thr = new Thread(delegate() 
        { 
         PushData(fileStream, e2.Result); 
         e2.Result.Close(); 
         fileStream.Close(); 
        }); 
        thr.Start(); 
       }; 
       wc.OpenWriteAsync(ub.Uri); 

      } 
     } 





     private static void PushData(Stream input, Stream output) 
     { 
      byte[] buffer = new byte[4096]; 
      int bytesRead = 0; 
      int tempTotal = 0; 



      while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       output.Write(buffer, 0, bytesRead); 
       tempTotal += bytesRead; 
       _uploadProg++; 
       int percentDone = (int)(((decimal)tempTotal/(decimal)input.Length) * 100); 
       _uploadProg = percentDone; 
       ProgressUpdated(null, new UploadProgressChangedEventArgs(percentDone)); 

       Thread.Sleep(50); 
      } 
     }