2011-10-14 6 views
6

Mi pregunta es: ¿Estoy leyendo MSDN incorrectamente O MSDN está equivocado? Estoy tratando de hacer referencia a una imagen Recurso a través de URI relativo.Wpf Absoluto frente a URI de paquete relativo

La página de MSDN titulado Paquete URIs en WPF establece claramente que:

"archivo de recursos en subcarpeta de ensamblaje local" = "/Subfolder/ResourceFile.xaml"

en la Tabla 2: URI relativos en Markup (aquí http://msdn.microsoft.com/en-gb/library/aa970069.aspx).

Así que, creé nuevos proyectos WPF/.NET 4.0 en Vs2010 (v10.0.40219.1 SP1Rel) para probar.

Startup Project: TryUri 
    App.xaml 
    MainWindow.xaml 
Custom Ctrl Project: TryUri.CCL 
    Icons/folder.png <-- Marked As Resource! 
    Views/TestUC.xaml 

En TestUC.xaml:

<Canvas> 
    <Border> 
     <Image Source="/Icons/folder.png" Height="Auto" Width="Auto" /> 
    </Border> 
</Canvas> 

En MainWindow.xaml:

// xmlns:uc="clr-namespace:TryUri.CCL.Views;assembly=TryUri.CCL" 

<uc:TestUC /> 

Resultado: La imagen no aparece !!

Cuando cambio la ruta a "../Icons/folder.png" Funciona.

Si copio Icons/folder.png en la carpeta TryUri.CCL/Views /, entonces funciona "Icons/folder.png".

Sin embargo, nunca puedo obtener una barra diagonal de avanzada para trabajar como en "/Icons/folder.png", como dice MSDN.

+0

Supongo que su directorio de trabajo está configurado incorrectamente en su proyecto. Yo comprobaría eso primero. –

+0

El directorio de trabajo sería importante si estuviera tratando de acceder al png como un archivo. No lo estoy, está marcado como un Recurso. Actualicé la pregunta para aclarar eso. Gracias. –

+0

Me respondí a continuación. Para mi proyecto, he elegido simplemente utilizar rutas relativas al marcado (es decir, "../icons/folder.png") ya que es la opción más simple de la OMI. –

Respuesta

12

La razón, cuando se ejecuta como un conjunto separado, que su pariente Paquete URI debe comenzar con ../ o ninguna barra invertida inicial es debido a la forma URI relativa se utilizan, from MSDN (emphasis mine):

absoluta frente relativa Paquete URI

...

Si se utiliza una barra invertida inicial , sin embargo, el paquete de referencia URI relativa es entonces considerado relativa a la raíz de la aplicación.

Por lo tanto, si desea que las imágenes de permanecer en relación con el ensamblaje de referencia, basta con omitir la barra inicial o utilizar ../ si en una subcarpeta.

Ver la imagen de abajo para ver un ejemplo de cómo se ve en tiempo de ejecución:

Absolute vs. Relative Pack URIs

+0

Intenté esto y no funciona con una barra diagonal. Tengo que usar "Icons/folder.png" para que funcione. –

+0

Gracias por la actualización. ¿Puedes comentar con un enlace a tu código? Tengo curiosidad por cómo conseguiste que eso funcione. Además, parece que dejó su TestUC y TestUC2.xaml en la carpeta/Views de WpfControlLibrary1 contrariamente a su respuesta. –

+0

Estoy revisando mi respuesta, creo que se requiere el '..' debido a cómo se usa su' UserControl' en tiempo de ejecución. – user7116

4

Basta con sustituir < ApplicationName> con el nombre de la aplicación y que esto debería funcionar

Source="/<ApplicationName>;component/Icons/folder.png" 
+1

Gracias. Sé que funcionará, pero quiero saber por qué MSDN dice que puedo hacer "/Subfolder/Resource.file-ext". –

7

La respuesta es la siguiente: La barra inicial en una ruta relativa siempre se resuelve al conjunto principal, no por la Asamblea que el marcado está en.

Para que funcione de la forma en que MSDN indica, tendría que almacenar todos los iconos en una carpeta "Iconos /" en el ensamblaje principal, en lugar de en el dll de control personalizado.

Si elige almacenar los recursos en el conjunto dll en una carpeta "Iconos /", debe hacer referencia a ellos con una ruta relativa al marcado en el que está trabajando (es decir, "../Icons/folder.png") O debe calificar el ruta con el nombre del ensamblado (es decir, "/AssemblyName;component/Icons/folder.png")

Cuestiones relacionadas