2012-08-09 44 views
10

Después de algunas búsquedas, parece que es bastante complicado cargar una imagen en tiempo de ejecución en una ventana de WPF?Cómo cargar imágenes a WPF en tiempo de ejecución?

 Image image; 
     image = new Uri("Bilder/sas.png", UriKind.Relative); 
     ????.Source = new BitmapImage(image); 

Estoy intentando este código, pero necesito ayuda para hacerlo funcionar. ¡Obtengo algunas líneas rojas debajo del código! También me pregunto si tengo que añadir algo de código adicional en el código XAML o es suficiente con esto:

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="350" /> 

Wonder becuase que he visto ejemplos con sorces a las imágenes dentro de las etiquetas XAML.

EDIT:

estoy usando este know:

 var uri = new Uri("pack://application:,,,/sas.png"); 
     var bitmap = new BitmapImage(uri); 
     image1.Source = bitmap; 

El XAML:

<Grid Width="374"> 
    <Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="350" /> 
    <Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="12,226,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Land" Height="23" HorizontalAlignment="Left" Margin="287,226,0,0" Name="btnLand" VerticalAlignment="Top" Width="75" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" /> 

</Grid> 

EDIT 2: Mi respuesta es "resuelto", pero con la ayuda som fuera Desbordamiento de pila. Este código funciona bien:

 BitmapImage image = new BitmapImage(); 
     image.BeginInit(); 
     image.UriSource = new Uri("pack://application:,,,/Resources/" + company + ".png"); 
     image.EndInit(); 
     image2.Source = image; 
+2

Los primero dos líneas de código no pueden ser correctas; un Uri NO es una imagen. –

+0

Gracias! ¡Pero sé que se queja del camino! Está buscando la ruta en C: ¿cuándo debería ser bin/debug? –

Respuesta

4

Asegúrese de que su sas.png se marca como Build Action: Content y Copy To Output Directory: Copy Always en su Visual Studio Properties ...

creo que el código fuente C# es la siguiente ...

 Image image = new Image(); 
    image.Source = (new ImageSourceConverter()).ConvertFromString("pack://application:,,,/Bilder/sas.png") as ImageSource; 

y XAML debe ser

 <Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" 
      Name="image1" Stretch="Fill" VerticalAlignment="Top" 
      Source="../Bilder/sas.png" 
      Width="350" /> 

EDITAR

dinámicamente creo XAML proporcionaría mejor manera de cargar las imágenes ...

 <Image Source="{Binding Converter={StaticResource MyImageSourceConverter}}" 
      x:Name="MyImage"/> 

donde image.DataContext es string camino.

MyImage.DataContext = "pack://application:,,,/Bilder/sas.png"; 

    public class MyImageSourceConverter : IValueConverter 
    { 
     public object Convert(object value_, Type targetType_, 
     object parameter_, System.Globalization.CultureInfo culture_) 
     { 
      return (new ImageSourceConverter()).ConvertFromString (value.ToString()); 
     } 

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

Ahora bien, como se establece un contexto de datos diferente, Image sería cargado automáticamente en tiempo de ejecución.

+0

Hmm, pero si quiero cargar diferentes imágenes durante el tiempo de ejecución. Cuando creo un objeto de la ventana WPF quiero pasar diferentes imágenes, ¿entonces supongo que el código XAML se vería diferente? He guardado todas las imágenes en un filtro dentro de Bin/Debug, ¿está bien? –

+0

revise mi respuesta editada arriba. –

+0

¡Gracias! ¿Pero no es su manera de complicarse de solo usar algunas imágenes? –

28

En WPF, una imagen normalmente se carga desde Stream o Uri.

BitmapImage apoya tanto y un Uri incluso se puede pasar como argumento del constructor:

var uri = new Uri("http://..."); 
var bitmap = new BitmapImage(uri); 

Si el archivo de imagen se encuentra en una carpeta local, que tendría que utilizar un file:// Uri.Se puede crear un tal Uri desde una ruta de la siguiente manera:

var path = Path.Combine(Environment.CurrentDirectory, "Bilder", "sas.png"); 
var uri = new Uri(path); 

Si el archivo de imagen es un recurso en un ensamblaje, el URI debe seguir el del Pack Uri esquema:

var uri = new Uri("pack://application:,,,/Bilder/sas.png"); 

En este caso, el Visual Studio Build Action para sas.png debería ser Resource.

Una vez que haya creado un BitmapImage y también tienen un control Image como en este XAML

<Image Name="image1" /> 

sólo tendría que asignar el BitmapImage a la propiedad Source de que el control de archivo:

image1.Source = bitmap; 
+0

¡Por favor, mira mi edición! –

+0

¿Pero qué pasa con el código en XAML? De esta manera:

+0

¿Has leído mi comentario a tu pregunta? – Clemens

Cuestiones relacionadas