2009-09-10 7 views
0

J'ai une application Silverlight 3 qui permet à l'utilisateur de télécharger des images, puis est censé les afficher. L'image se téléchargé bien (je peux voir dans le navigateur), mais je reçois l'erreur suivante de Silverlight:Image ne peut pas être affichée dans Silverlight

Message: Sys.InvalidOperationException: erreur ImageError # 4001 dans le contrôle 'Xaml1': AG_E_NETWORK_ERROR ligne: 453 Char: 17 code: 0 URI: http://www.greektools.net/ScriptResource.axd?d=J4B4crBmh4Qxr3eVyHw3QRgAKpCaa6XLu8H_2zpAs7eWeADXG9jQu_NCTxorhOs1x6sWoSKHEqAL37LcpWepfg2&t=fffffffffd030d68

rapports Fiddler: il y a un problème avec la ressource que vous recherchez, et il ne peut pas être affiché.

Merci d'avance pour votre aide.

Répondre

1

Ici, il est dans trois fichiers. Ceci est également disponible sur mon blog, qui est répertorié dans mon profil.

XAML (imageuploader.xaml):

<UserControl x:Class="ImageEditor.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480" MouseMove="UserControl_MouseMove"> 

    <Grid x:Name="LayoutRoot" Background="Azure" Width="800" Height="600"> 
    <Image x:Name="MainImage" Source="images/image.jpg" Width="300" HorizontalAlignment="Center" VerticalAlignment="Center"></Image> 
    <Button x:Name="UploadImage" Click="UploadImage_Click" Content="Upload"></Button> 
    </Grid> 
</UserControl> 

Code (imageuploader.xaml.cs):

private void UploadImage_Click(object sender, RoutedEventArgs e) 
     { 
      OpenFileDialog dlg = new OpenFileDialog(); 
      dlg.Multiselect = false; 
      dlg.Filter = "All files (*.*)|*.*|PNG Images (*.png)|*.png"; 

      bool? retval = dlg.ShowDialog(); 

      if (retval != null &amp;&amp; retval == true) 
      { 
       UploadFile(dlg.File.Name, dlg.File.OpenRead()); 
       StatusText.Text = dlg.File.Name; 
      } 
      else 
      { 
       StatusText.Text = "No file selected..."; 
      } 
     } 

     private void UploadFile(string fileName, Stream data) 
     { 
      string host = Application.Current.Host.Source.AbsoluteUri; 
      host = host.Remove(host.IndexOf("/ClientBin")); 

      UriBuilder ub = new UriBuilder(host + "/receiver.ashx"); 
      ub.Query = string.Format("filename={0}", fileName); 
      WebClient c = new WebClient(); 
      c.OpenWriteCompleted += (sender, e) =&gt; 
      { 
       PushData(data, e.Result); 
       e.Result.Close(); 
       data.Close(); 
      }; 
      c.WriteStreamClosed += (sender, e) =&gt; 
      { 
       LoadImage(fileName); 
      }; 
      c.OpenWriteAsync(ub.Uri); 
     } 

     private void LoadImage(string fileName) 
     { 
      // 
      // Creating WebClient object and setting up events 
      // 
      WebClient downloader = new WebClient(); 
      downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted); 
      //downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(downloader_DownloadProgressChanged); 

      // 
      // Specify Image to load 
      // 
      string host = Application.Current.Host.Source.AbsoluteUri; 
      host = host.Remove(host.IndexOf("/ClientBin")); 

      fileName = host + "/images/" + fileName; 
      downloader.OpenReadAsync(new Uri(fileName, UriKind.Absolute)); 
     } 

     void downloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
     { 
      // 
      // Create a new BitmapImage and load the stream 
      // 
      BitmapImage loadedImage = new BitmapImage(); 
      loadedImage.SetSource(e.Result); 

      // 
      // Setting our BitmapImage as the source of a imageControl control I have in XAML 
      // 
      MainImage.Source = loadedImage; 
     } 

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

      while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       output.Write(buffer, 0, bytesRead); 
      } 
     } 

Handler (receiver.ashx):

[WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    public class receiver : IHttpHandler 
    { 

     public void ProcessRequest(HttpContext context) 
     { 
      string filename = context.Request.QueryString["filename"].ToString(); 

      using (FileStream fs = File.Create(context.Server.MapPath("~/images/" + filename))) 
      { 
       SaveFile(context.Request.InputStream, fs); 
      } 
     } 

     private void SaveFile(Stream stream, FileStream fs) 
     { 
      byte[] buffer = new byte[4096]; 
      int bytesRead; 
      while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0) 
      { 
       fs.Write(buffer, 0, bytesRead); 
      } 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 


    } 
Questions connexes