2011-07-26 26 views
8

Estoy configurando el contenido de un Botón para una Imagen. Se ve algo como esto:¿En el tiempo de diseño, el paquete uri es válido, pero no en tiempo de ejecución?

<Button> 
    <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" /> 
</Button> 

En mi proyecto tengo una subcarpeta denominada NavigationImages y dentro de esa carpeta es la nav_up_left.png archivo de imagen.

Cuando veo el Diseñador, aparece la imagen, sin embargo, durante el tiempo de ejecución, recibo un error de IOException indicando que no puedo encontrar el recurso.

La acción de compilación está establecida en Recurso.

En realidad, esto funcionó bien en un solo proyecto. Pero cuando lo copié sobre el otro proyecto, falla. Esto parece ser un problema increíblemente simple, pero me encuentro perplejo y listo para comenzar a sacar el pelo. @ _ @

¡Tus pensamientos y sugerencias serán muy apreciados!

Respuesta

9

Cachorro, lo descubrí ... un poco.

He copiado ese código xaml de un proyecto donde el tipo de salida es Aplicación de Windows, a otro proyecto donde el tipo de salida es Biblioteca de clases.

No lo pensé en ese momento, pero aparentemente cuando el tipo de salida es una Biblioteca de clases, el URI del paquete debe cambiar.

Así que en lugar de "pack://application:,,,/NavigationImages/nav_up_left.png" lo cambié a "/ProjectName;component/NavigationImages/nav_up_left.png" y ahora está funcionando bien.

No estoy 100% claro por qué esto funciona y no el primero. He leído el MSDN documentation on pack URIs in WPF pero tal vez malinterpreté algo.

Dejaré esta respuesta sin marcar si alguien puede darme una buena explicación de por qué lo que tenía anteriormente no funciona en un proyecto con el tipo de salida Class Library.

Probablemente me esté perdiendo algo realmente simple. @ _ @

+0

confundido ... ¿lo cambiaste a lo que dices oa "paquete: // aplicación: ,,,/ProjectName; component/NavigationImages/nav_up_left.png"? – mike01010

+1

Hola. Ha pasado un tiempo desde que tuve este problema, pero estoy bastante seguro de que lo cambié a "/ProjectName;component/NavigationImages/nav_up_left.png" –

+0

Acabo de probar esto. Ambas opciones funcionan (con paquete: // aplicación: ,,, y sin) – surfen

1

Otra solución para conseguir este derecho:

vez que su imagen Acción de generación se establece en 'recurso' y ha reconstruido, vaya a las propiedades de su objeto <Image />. La ventana de propiedades proporcionará un navegador recurso de archivo ..., con lo cual la selección de su imagen el atributo Source="..." de su <Image /> serán llenados correctamente en.

2

Sólo para arrojar luz sobre lo que estaba ocurriendo en su situación. El segundo paquete uri. El que funcionó. Está destinado a recursos ubicados en un ensamblaje que no sea la aplicación de host. Por lo que se dice, ¿la aplicación host estaba cargando este recurso de la Biblioteca de clases en cuestión?

Puede ver las diferencias en los esquemas de paquete de uri aquí: MSDN Pack URI Scheme

Los cambios uri ligeramente al hacer referencia a un recurso desde el conjunto principal, y haciendo referencia a uno de otro montaje.

Además, el paquete: // application: ,,, incluye lo que se conoce como la "autoridad", omitirlo básicamente lo haría una ruta relativa, ambos son válidos en la mayoría de los casos donde se asume la autoridad de la aplicación .

EDITAR: básicamente porque /Subfolder/Resource.xaml(.jpg etc.) y /Assembly;component/Resource.xaml son muy similares, este último le dice al analizador/cargador que está buscando en un conjunto al que se hace referencia, no en el ensamblaje de la aplicación principal. (Imagino que esto ayuda a acelerar la búsqueda).

+0

+1 esta es probablemente la explicación más cercana de lo que salió mal, me parece :-) – Heliac

3

Luché con este mismo problema por bastante tiempo, y creo que parte de lo que estaba fallando en el original era la palabra faltante "componente". Yo, por ejemplo, tenía

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg"); 

pero debe han tenido

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg"); 

La palabra "componente" no es parte de la ruta, a pesar de su apariencia - es una cadena literal que tiene que estar ahí ¿Por qué? Alguien pensó que sería una buena idea, supongo.

Y para aquellos que luchan con otra parte de la cosa, ¿qué pasa con "MyApp"? Ese es el nombre de la Asamblea. Haga clic derecho en el nombre de su proyecto, seleccione "Propiedades ..." y debajo de la pestaña "Aplicación" verá el campo "Nombre de ensamblado:".

Si no se siente como la búsqueda de ese (o preocuparse de que podría cambiar, romper su código), usted puede hacer esto:

String appUri = @"pack://application:,,,/" + 
        System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";"; 
String path = appUri + "component/images/mona2.jpg"; 
myBitmapImage.UriSource = new Uri(path); 
No

código muy bonita, tengo que admitir - que puede claramente se acortará, pero te llevará a donde tengas que ir, espero. ¡Recuerde establecer la propiedad "Construir" en su archivo de imagen en "Recurso"!

Cuestiones relacionadas