Domanda

Non sono stato in grado di trovare una risposta a questo.

Ho un database che contiene percorsi di immagine (" images / myimage.jpg "). Queste immagini esistono sul mio sito asp.net che è anche il luogo in cui ospito la SL. Voglio associare queste immagini al mio controllo ListBox in modo che l'immagine venga visualizzata.

Ho letto che dal momento che ho un valore di stringa, " images / myimage.jpg " ;, che devo convertirlo in un'immagine BitMap. Ho fatto questo:

Il xaml:

 <Image Source="{Binding ImageFile, Converter={StaticResource ImageConverter}}"/>

La classe ImageConverter:

    public object Convert(object value, Type targetType,
                                  object parameter, CultureInfo culture)
            {
                try
                {
                    Uri source= new Uri(value.ToString());
                    return new BitmapImage(source);
                }
                catch(Exception ex)
                {
                    return new BitmapImage();
                }
            }

Ricevo un errore durante la creazione dell'URI, "Il formato dell'URI non è stato determinato". Che cosa sto facendo di sbagliato? Se creo un Uri simile al seguente: http: // localhost: 49723 / images / myimage.jpg , funziona perfettamente.

Perché non basta " images / myimage.jpg " lavorare?

È stato utile?

Soluzione

I percorsi relativi ai media in Silverlight sono stravaganti, quindi possono funzionare allo stesso modo (stravagante) dei percorsi WPF. I percorsi relativi sono relativi al file XAP, non alla radice dell'app.

Un trucco è spostare il tuo XAP nella radice del tuo sito web , quindi i percorsi dei media saranno relativi alla radice.

Vedi il mio post sugli URI relativi in ??Silverlight qui .

Altri suggerimenti

Un approccio semplice e dinamico che funzionerà indipendentemente da dove si trova il tuo file XAP è simile al seguente.

//Get the root path for the XAP
string src = Application.Current.Host.Source.ToString();

//Get the application root, where 'ClientBin' is the known dir where the XAP is
string appRoot = src.Substring(0,src.IndexOf("ClientBin")); 

//Create the image / uri
BitmapImage img = new BitmapImage();
img.UriSource = new Uri(appRoot + "/Images/myImage.png", UriKind.Relative);

Questo aiuta?

Oggi ho riscontrato questo problema da solo e l'ho risolto nel modo in cui Jon descrive sopra (senza vedere il tuo post però. Avrei potuto risparmiarmi un po 'di tempo.) Vorrei anche sottolineare che l'errore specifico può essere risolto utilizzando il sovraccarico :

Uri source = new Uri("Path/Image.jpg", UriKind.Relative);

Non saresti ancora in grado di accedere alla sottodirectory delle immagini senza spostare il file XAP, ma risolve il messaggio di errore. A quel punto il programma restituisce felicemente un'immagine senza contenuto, lasciandoti usare Fiddler o Web Dev Helper per capire il vero problema.

http: / /www.silverlightexamples.net/post/How-to-Get-Files-From-Resources-in-Silverlight-20.aspx

Risorsa e non copiare mai sull'immagine, quindi usa " SLapplicationName; component / mypathtoimage / image.png "

using System.Windows.Resources;      // StreamResourceInfo
using System.Windows.Media.Imaging;  // BitmapImage
....

StreamResourceInfo sr = Application.GetResourceStream(
    new Uri("SilverlightApplication1;component/MyImage.png", UriKind.Relative));
BitmapImage bmp = new BitmapImage();
bmp.SetSource(sr.Stream); 

Puoi semplicemente scrivere un metodo che ti dia l'indirizzo completo del server (protocollo: // server: port /) e usarlo per creare URL assoluti:

public class Helper{
    public static string ServerAddress{
        get{
            if (_server == "")
                _server = _ServerAddress();
            return _server;
        }
    }

     private static string _ServerAddress(){
        HttpContext ctx = HttpContext.Current;
        if (ctx == null) return "";

        HttpRequest request = ctx.Request;
        if (request == null) return "";

      string srvr = request.ServerVariables["SERVER_NAME"];
      string port = string.IsNullOrEmpty(request.ServerVariables["SERVER_PORT"])?
            "" : ":" + request.ServerVariables["SERVER_PORT"];
      string protocol = "http://";//request.ServerVariables["SERVER_PROTOCOL"];
      return string.Format("{0}{1}{2}{3}", protocol, srvr, port, 
                   request.ApplicationPath);
    }
}    

e modifica la riga del metodo del convertitore:

Uri source= new Uri(value.ToString());

a

if(!string.IsNullOrEmpty(value.ToString()))
   Uri source= new Uri(Helper.WebAddress + value.ToString());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top