2012-09-03 27 views
7

Por ejemplo tengo la siguiente estructura del proyecto:URI a un archivo local en relación con el montaje

Root\Core\Application.exe 
Root\Modules\Assembly.dll 
Root\Modules\Icons\Icon.png 

Mi aplicación.exe carga el assembly.dll. Assembly.dll incluye un UserControl de WPF con un control de imagen. Icon.png no es un recurso incrustado, es un archivo local (Build: Content).

He intentado todas las posibles URI de la Fuente-Propiedad del control de imagen, pero nunca muestra la imagen :-(

<Image Source="Icons\Icon.png" /> 
<Image Source="pack://application:,,,/Icons\Icon.png" /> 
<Image Source="pack://application:,,,/Assembly;component/Icons/Icon.png" /> 

etc.

¿Cómo funciona la URI tiene que parecer?

Respuesta

5

Esta afirmación implica que no se puede hacer referencia a los archivos de contenido en su Asamblea ... (tan sólo los archivos de contenido que se especificaron en su solicitud se pueden resolver mediante la "aplicación: //").

http://msdn.microsoft.com/en-us/library/aa970069(v=vs.85).aspx

Los archivos de contenido en ensamblados de referencia no se incluyen debido a que no están respaldadas por WPF. Los URI de paquete para archivos incrustados en los ensamblados de referencia son únicos porque incluyen tanto el nombre del ensamblado al que se hace referencia como el sufijo del componente; Los URI de paquete para el sitio de los archivos de origen son únicos porque usan los únicos URI de paquete que usan el sitio de origen: /// autoridad.

Puede obtener un lugar con "siteoforigin" que se refiere a la ubicación donde se ejecuta su .exe.

Source="pack://siteoforigin:,,,/../Modules/Icons/Icon.png" 

o

Source="pack://siteoforigin:,,,/Icons/Icon.png" 

A pesar de que puede no ser compatible la ruta relativa.

Dar a este un tiro así:

Source="../Modules/Icons/Icon.png" 

Y esto:

Source="Icons/Icon.png" 

Un consejo al experimentar con Paquete de URIs se construirlas mediante el PackUriHelper, por lo que se ajustan a la adecuada sintaxis/semántica.

ver algunos mensajes relacionados:


Otra idea ....

Haces c debería definir su propia MarkupExtension que ayudó a construir una ruta de acceso absoluta a sus archivos png.

Tendría una configuración de configuración global que se configuró justo antes de cargar su DLL con LoadFrom.

allí tendría que hacer su XAML utilizar la extensión:

Source={local:MyMarkupExtensionPathBuilder Icon.png} 

utilizar esto como un punto de partida ... en el caso de que no desee utilizar "aplicación: //", aunque ... desea construir el Uri como un URI de tipo de ruta de "archivo" absoluto y recto, por ejemplo "C: \ Archivos de programa \ miapplication \ Root \ Modules \ Icons \ icon.png".

Usted puede conseguir su MarkupExtension para devolver el BitmapSource directamente (o simplemente conseguir que se devuelva una cadena ... que luego de un TypeConverter se resuelve en un BitmapSource de todos modos).

(también podría hacer algo similar con un Enlace que utiliza un Convertidor para concatenar las 2 partes de la ruta, o hacer que su ViewModel haga la concatenación si usa una ... la markupextension es una manera más ordenada de hacerlo sin embargo)

+0

Hola, gracias, pero no sé la ruta relativa de la application.exe a la ruta del ensamblado dentro del archivo XAML. Entonces, tal vez la carpeta "Módulos" esté almacenada en otro lugar. Entonces, solo Assembly y Icon.png están en la misma carpeta y UserControl en Assembly debería mostrar Icon.png. La ruta/URI debe establecerse en el código XAML. –

+0

Esto no funciona. Ya lo intenté, como puedes ver en mi primera publicación. Y, por supuesto, existe el Icon.png en la carpeta correcta ;-) Creo que no tiene nada que ver con cargar el ensamblaje manualmente, porque creé una solución de prueba y allí tengo una Application y una ClassLibrary, y establecí una referencia a ClassLibrary y directamente agregó UserControl desde ClassLibrary en MainWindow.xaml. Todo está en la misma carpeta de salida. El URI tiene que ser una ruta relativa al ensamblado que contiene el UserControl y el Icon.png (como un archivo). –

+0

siteoforigin solo funciona, si todo está en la misma carpeta (o tal vez conozco la ruta relativa de la aplicación a la carpeta de los módulos). Por cierto: yo uso Assembly.LoadFrom. El ensamblaje se puede almacenar en todas partes en la computadora. Es por eso que no conozco la ruta relativa de la aplicación al ensamblado en el momento del diseño. –

Cuestiones relacionadas