2011-11-22 14 views
5

He llegado a poner un archivo en una secuencia desde una url. Sin embargo, puttin savefiledialog dentro del evento OpenReadCompleted da una excepción porque el savefiledialog necesita ser disparado desde un evento iniciado por el usuario. Poner el savefiledialog NO dentro de OpenReadCompleted da un error porque el conjunto de bytes está vacío, aún no procesado. ¿Hay alguna otra manera de guardar un archivo para transmitir desde una uri sin usar un evento?descargue el archivo de uri absoluto para transmitir a SaveFileDialog

public void SaveAs() 
{ 
WebClient webClient = new WebClient(); //Provides common methods for sending data to and receiving data from a resource identified by a URI. 
     webClient.OpenReadCompleted += (s, e) => 
              { 
               Stream stream = e.Result; //put the data in a stream 
               MemoryStream ms = new MemoryStream(); 
               stream.CopyTo(ms); 
               bytes = ms.ToArray(); 
              }; //Occurs when an asynchronous resource-read operation is completed. 
     webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute); //Returns the data from a resource asynchronously, without blocking the calling thread. 

     try 
     { 
     SaveFileDialog dialog = new SaveFileDialog(); 
     dialog.Filter = "All Files|*.*"; 

     //Show the dialog 
     bool? dialogResult = dialog.ShowDialog(); 

     if (dialogResult != true) return; 

     //Get the file stream 
     using (Stream fs = (Stream)dialog.OpenFile()) 
     { 
      fs.Write(bytes, 0, bytes.Length); 
      fs.Close(); 

      //File successfully saved 
     } 
     } 
     catch (Exception ex) 
     { 
      //inspect ex.Message 
      MessageBox.Show(ex.ToString()); 
     } 

} 

Respuesta

7

El enfoque a tomar es primera abrir el SaveFileDialog como resultado de algún tipo de interacción del usuario, como un clic de botón. Una vez que el usuario haya determinado dónde guardar la descarga y le haya devuelto el método SaveDialog, mantenga a mano esa instancia de SaveFileDialog.

A continuación, invoque la descarga y en el OpenReadCompleted puede utilizar el método SaveFileDialogOpenFile para obtener una secuencia a la que puede bombear el resultado.

public void SaveAs() 
{ 
    SaveFileDialog dialog = new SaveFileDialog(); 
    dialog.Filter = "All Files|*.*"; 

    bool? dialogResult = dialog.ShowDialog(); 

    if (dialogResult != true) return; 

    WebClient webClient = new WebClient(); 
    webClient.OpenReadCompleted += (s, e) => 
    { 
     try 
     {  
      using (Stream fs = (Stream)dialog.OpenFile()) 
      { 
       e.Result.CopyTo(fs); 
       fs.Flush(); 
       fs.Close(); 
      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    }; 
    webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute); 
} 

Se habrá dado cuenta de que no sólo es el código más limpio y más sencillo, pero si el usuario termina de cancelar el SaveFileDialog usted no ha perdido el tiempo o el ancho de banda de descarga de un archivo.

+0

¡Funciona perfectamente! ¿Por qué no pensé en eso? Probablemente porque soy un novato. Muchas gracias. – tutu

0

encontré una manera simple de descargar el archivo de la aplicación silverlight. use el control HyperLinkButton.

puede especificar objetivo también usando hotel fenomenal "TargetName".

+1

Esto es más adecuado como comentario. –

Cuestiones relacionadas