Mostrar Imagenes en Silverlight fuera de la carpetaClientBin
Actualmente estoy desarrollando una aplicacion en ASP .NET en Visual Studio 2008. Lo que parecía algo muy simple me quitó mas de una hora de mi tiempo. La aplicación contiene un control de Silverlight el cual muestra una foto al hacer click a un boton, pero la imagen no se estaba cargando. Lo primero que hice fue agregar el event handler de ImageFailed al elemento <Image> y me di cuenta que me estaba diciendo que el url era inválido. Yo tengo mi carpeta de imagenes el el root de mi Projecto Web (http://servidor/Images) y siempre uso esa estructura. El problema radica en que la mayoria de las veces al crear la aplicación de Silverlight, por default VS the pone el archivo xap (el cual contiene todos los recursos utilizados por la aplicación de Silverlight) en una carpeta que se llama ClientBin. Al cargar tu página, el control de silverlight se encuentra en esta carpeta y por consiguiente todos los paths que busca son relativos a esta misma. Yo pense que la solución era agregarle “../” a mi path de la imagen para que se fuera a la carpeta padre de ClientBin, pero por razones de seguridad al parecer VS no te deja salirte de esa carpeta al querer jalar algo desde el code behind del control de Silverlight. Como yo soy muy quisquilloso y no quiero meter mi carpeta de Images dentro de ClientBin y busque otra alternativa. Encontre dos formas distintas de lograr accesar a tus carpetas de media desde fuera de ClientBin.
La primera consiste en no seleccionar una carpeta al crear tu aplicacion de Silverlight

Como se darán cuenta, en donde dice “Destination Folder”, borre la carpeta por default ClientBin y lo deje en blanco. Esto insertara el archivo xap en el root del projecto web y por lo tanto, todas las carpetas serán relativas al control de Silverlight.
La segunda opcion es usar paths absolutos al especificarle la imagen. Esto lo podemos lograr de la siguiente manera:
Uri uri = new Uri(Application.Current.Host.Source, “../Images/”);
Foto.Source = new BitmapImage(new Uri(uri + nombrefoto, UriKind.Absolute));
Lo que hace la primer linea es crear un objeto de tipo Uri el cual recibe dos parametros, el primero regresa el path completo de la ubicación actual, en este caso http://servidor/ClientBin
El segundno parametro es una ubicación relativa al path actual y como tenemos “../Images/”, entonces el path final sera http://servidor/Images
Al llamar la propiedad Source en la imagen, le vamos a enviar un url completo y a este le vamos a agregar el nombre de la foto y le vamos a decir que es un Uri de tipo Absoluto.
Cualquiera de los dos métodos me funcionó bien pero en lo particular me quedo con la segunda opción ya que para mi es muy importante siempre mantener la misma estructura de tus aplicaciones y que haya una cierta consistencia.
Pueden dejar sus dudas u opiniones en la seccion de comentarios.
Leave a Reply