2009-09-18 17 views
12

Tengo problemas para configurar el origen de las imágenes en mi aplicación Wpf. Tengo una imagen en la que la fuente está vinculado a la propiedad SourceUri del objeto DataContext, así:Wpf - ruta de origen de la imagen relativa

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

Ahora, no sé qué integrado en los edificios SourceUri de mi objeto. Establecer la ruta absoluta completa ("c: /etc/image.jpg") se muestra muy bien, pero obviamente quiero establecer la ruta relativa. Mis imágenes se almacenan en una carpeta Recursos que está en la misma carpeta que mi carpeta de aplicaciones. Al final, estas imágenes pueden provenir de cualquier lugar, por lo que agregarlas al proyecto realmente no es una opción.

He intentado la ruta relativa a la carpeta de la aplicación y relativa a la ruta de trabajo (carpeta de depuración). También intenté usar la sintaxis "pack: // .." sin suerte, pero leí que esto no tendría ningún sentido.

¿Alguna pista sobre lo que debo probar?

Respuesta

9

Quizás podría hacer que la propiedad SourceUri de su objeto DataContext sea un poco más inteligente, y determinar cuál es la carpeta de la aplicación, y devolver una ruta absoluta basada en eso. Por ejemplo:

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

Claro - que funciona - Thx! Sin embargo, no pude encontrar una buena manera de encontrar la carpeta de la aplicación, así que me siento un poco hacky en este momento. ¿Hay un GetApplicationFolder() en .Net? No se pudo encontrar uno ... ¿Pero las referencias de ruta relativas no deberían funcionar de alguna manera? ¿Y estos serán relativos a la carpeta raíz de la aplicación? ¿No? – stiank81

+1

try Path.GetDirectoryName (Assembly.GetExecutingAssembly().Ubicación); –

+0

Eso me da lo mismo que el que estoy usando, "Path.GetFullPath (". "), Pero supongo que este último depende de la carpeta de trabajo. Así que sigue tu sugerencia. Tengo más problemas al respecto, pero Lo averiguaré ... ¡Por su atención! – stiank81

3

Environment.CurrentDirectory le mostrará la carpeta del archivo .exe se almacena en (es decir a menos que establezca manualmente un .CurrentDirectory - pero entonces podemos suponer que ya sabe donde está).

17

Hay un método útil en System.IO.Path que puede ayudar con esto:

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

Esto debería devolver 'C: \ Folders \ MoreFolders \ Resources \ image.jpg' o lo que es la ruta completa en tu contexto. Utilizará la carpeta de trabajo actual como punto de partida.

Link to MSDN documentation on GetFullPath.

+2

Esto es genial, todavía funciona si quiero proporcionar mi propia ruta completa. – paddy

7

Después de algunas veces frustrante tratar con

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

y

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

y

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

que resolvieron este implementar mi propia converso ER:

C# lateral:

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(); 
    } 
} 

lado XAML:

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

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

Cheers,

Sérgio