style page wpf xaml resources

page - style resourcedictionary wpf



WPF UserControl no puede encontrar el recurso XAML en el proyecto de referencia (5)

En mi proyecto WPF mantengo un control de usuario en un proyecto de biblioteca independiente. El control de usuario accede a los recursos en un archivo XAML separado, como este:

<UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Resources/ViewResources.xaml" /> </ResourceDictionary.MergedDictionaries> <!-- Local styles here --> </ResourceDictionary> </UserControl.Resources>

El archivo de recursos, ViewResources.xaml, reside en una carpeta en el proyecto de la biblioteca de control denominado Recursos. Tiene la acción de compilación predeterminada (Página) y la herramienta personalizada (MSBuild: Compile).

El problema es cuando hago referencia a la biblioteca de control en mi aplicación WPF y uso el control de usuario. En el tiempo de ejecución, obtengo la siguiente excepción XamlParseException:

Set property ''System.Windows.ResourceDictionary.Source'' threw an exception.

... que envuelve la excepción IOException:

Cannot locate resource ''resources/viewresources.xaml''.

¿Cómo puedo arreglar esto? He intentado cambiar la acción de compilación del archivo de recursos a "contenido" y hacer que se copie en el directorio de salida (que funciona para archivos y recursos "tontos" similares). Pero fue en vano. Además, no funciona la propiedad en el control del usuario entonces.

¿Hay una mejor manera de especificar la ruta?

¿Tendré que mover el archivo de recursos al proyecto de la aplicación (preferiría no hacerlo, ya que pertenece al dominio del control del usuario)?


En mi caso, tuve el ResourceDictionary y el UserControl en la misma biblioteca, pero separados de la aplicación principal. Lo que funcionó para mí fue especificar el nombre del ensamblaje en el formato que Adam sugirió en el comentario Y tuve que cambiar el ResourceDictionary en el proyecto de Embedded Resource to Page . No intenté usar el formato pack: //, pero supongo que también funcionaría.

<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>


Lo encontré.

Resulta que hay una mejor manera de especificar la ruta, Pack URIs . Cambié el XAML a lo siguiente:

<UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" /> </ResourceDictionary.MergedDictionaries> <!-- Local styles here --> </ResourceDictionary> </UserControl.Resources>

Y eso lo arregló.


Pensé que valía la pena publicar esto en caso de que alguien más esté luchando con el mismo problema, ya que he pasado más de dos horas luchando con la sintaxis, etc., solo para encontrar que la solución era muy simple, pero no tan aparente: cuando se hace referencia a un recurso empaquetado de otra biblioteca de control, parece funcionar bien en el momento del diseño e incluso se compila sin error, pero falla en el tiempo de ejecución con el error ''Establecer propiedad'' System.Windows.ResourceDictionary.Source ''lanzó una excepción''. Resulta que simplemente no es suficiente hacer referencia al conjunto de recursos desde su biblioteca de control, TAMBIÉN necesita agregar una REFERENCIA al conjunto que contiene el diccionario de recursos en su conjunto principal de la aplicación , de lo contrario, parece que no se compila en la aplicación. (es decir, la aplicación de inicio (la que tiene app.xaml) -> Agregar referencia -> seleccione el ensamblaje con el / los archivo (s) de recursos referenciados).

¡Espero que esto ayude!


Tuve el mismo error ( IOException - archivo no encontrado ), que me costó un día de mi vida que nunca volveré.

No utilicé ni la sintaxis más sencilla de " / assemblyname ... " ni la de " pack: // .... ".

Estaba haciendo referencia correctamente al conjunto de recursos en mi conjunto principal.

El error desapareció cuando cambié mi propiedad Build Action del archivo de recursos xaml a "Resource", como se mencionó anteriormente.

Sin embargo, luego me encontré con una XamlParseException en esta línea:

<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

(que había escrito a mano).

Esto dejó el archivo de recursos xaml que intentaba incluir con una dependencia no válida.

Curiosamente, la solución fue eliminar la propiedad ImageSource que había escrito, volver a insertarla PERO seleccionar la imagen de los menús desplegables que aparecen como resultado.

A pesar de que la línea resultante es exactamente igual, claramente no lo es.

Empezando a disgustar WPF (VS2013), pero espero que esto ayude.

: 0 /


Tuve la misma situación, pero los URI del paquete no me ayudaron, aún estaba recibiendo la excepción "No se puede localizar el recurso ..." en el proyecto de referencia (ejecutable). Lo que me ayudó, fue la configuración de mis archivos ResourceDictionary en el proyecto de biblioteca de control personalizado como Recurso incrustado .