2009-09-18 13 views
12

Ho problemi nell'impostare la sorgente per le immagini nella mia applicazione Wpf. Ho un'immagine in cui la sorgente è legato alla proprietà SourceUri dell'oggetto DataContext, in questo modo:Wpf - percorso sorgente immagine relativa

<Image Source="{Binding SourceUri}"></Image> 

Ora, io non so cosa sorge nella proprietà SourceUri del mio oggetto. Impostando il percorso assoluto completo ("c: /etc/image.jpg") viene visualizzato correttamente, ma ovviamente voglio impostare il percorso relativo. Le mie immagini sono memorizzate in una cartella Risorse che si trova nella stessa cartella della mia cartella dell'applicazione. Alla fine queste immagini potrebbero venire da qualsiasi luogo, quindi aggiungerle al progetto non è un'opzione valida.

Ho provato il percorso relativo alla cartella dell'applicazione e relativo al percorso di lavoro (cartella di debug). Ho anche provato a usare la sintassi "pack: // .." senza fortuna, ma ho letto che non sarebbe stato un problema.

Qualche suggerimento su cosa dovrei provare?

risposta

9

Forse potresti rendere un po 'più intelligente la proprietà SourceUri del tuo oggetto DataContext e determinare quale sia la cartella dell'applicazione e restituire un percorso assoluto basato su tale. Per esempio:

public string SourceUri 
{ 
    get 
    { 
     return Path.Combine(GetApplicationFolder(), "Resources/image.jpg"); 
    } 
} 
+0

Certo - che funziona - Thx! Non ho trovato un buon modo per trovare la cartella dell'applicazione, quindi mi sento un po 'hacky al momento .. Esiste un GetApplicationFolder() in .Net? Impossibile trovarne uno .. Ma i riferimenti relativi ai percorsi relativi non dovrebbero funzionare in qualche modo? E questi saranno quindi relativi alla cartella radice dell'applicazione? No? – stiank81

+1

try Path.GetDirectoryName (Assembly.GetExecutingAssembly().Posizione); –

+0

Questo mi dà lo stesso di quello che sto usando, "Path.GetFullPath (". "), Ma suppongo che quest'ultimo dipenda dalla cartella di lavoro, quindi segui il tuo suggerimento. Lo scoprirò .. Thx per la tua attenzione! – stiank81

3

Environment.CurrentDirectory vi mostrerà la cartella il file exe viene memorizzato in (cioè a meno di impostare manualmente un .CurrentDirectory - ma poi possiamo supporre che già sai dove si trova).

17

C'è un metodo utile in System.IO.Path che può aiutare con questo:

return Path.GetFullPath("Resources/image.jpg"); 

Questo dovrebbe tornare 'C: \ Folders \ MoreFolders \ Resources \ image.jpg' o qualunque sia il percorso completo è nel tuo contesto. Utilizzerà la cartella di lavoro corrente come punto di partenza.

Link to MSDN documentation on GetFullPath.

+2

Questo è fantastico - funziona ancora se voglio fornire il mio percorso completo. – paddy

7

Dopo alcune volte frustrante cercare con

<Image Source="pack://application:,,,/{Binding ChannelInfo/ChannelImage}"> 

e

<Image Source="pack://siteoforigin:,,,/{Binding ChannelInfo/ChannelImage}"> 

e

<Image Source="/{Binding ChannelInfo/ChannelImage}"> 

Ho risolto questo attuazione mia convert er:

C# lato:

public class MyImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string path= (string)value; 

     try 
     { 
      //ABSOLUTE 
      if (path.Length > 0 && path[0] == System.IO.Path.DirectorySeparatorChar 
       || path.Length > 1 && path[1] == System.IO.Path.VolumeSeparatorChar) 
       return new BitmapImage(new Uri(path)); 

      //RELATIVE 
      return new BitmapImage(new Uri(System.IO.Directory.GetCurrentDirectory() + System.IO.Path.DirectorySeparatorChar + path)); 
     } 
     catch (Exception) 
     { 
      return new BitmapImage(); 
     } 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

lato XAML:

<UserControl.Resources> 
    <local:ImageConverter x:Key="MyImageConverter" /> 
    (...) 
</UserControl.Resources> 

<Image Source="{Binding Products/Image, Converter={StaticResource MyImageConverter}}"> 

Cheers,

Sérgio