2008-12-03 813 views
217

Tengo archivos de diccionario de recursos (MenuTemplate.xaml, ButtonTemplate.xaml, etc.) que quiero usar en múltiples aplicaciones separadas. Podría agregarlos a los ensamblados de las aplicaciones, pero es mejor si compilo estos recursos en un solo ensamblaje y hago que mis aplicaciones lo hagan referencia, ¿no?ResourceDictionary en un ensamblado aparte

Después de construir el conjunto de recursos, ¿cómo puedo hacer referencia a él en la aplicación.xaml de mis aplicaciones? Actualmente utilizo ResourceDictionary.MergedDictionaries para fusionar los archivos de diccionario individuales. Si los tengo en un ensamblado, ¿cómo puedo hacer referencia a ellos en xaml?

+1

Esto puede ser una exageración, pero es posible que desee preparar sus recursos para Exportar utilizando la técnica que se describe aquí: https://alexfeinberg.wordpress.com/2015/08/16/safely-export-wpf-resources/. La principal ventaja de hacer esto es evitar problemas con las múltiples versiones del conjunto de recursos que se cargan en el mismo dominio de aplicación. – user195275

Respuesta

312

Eche un vistazo a pack URI syntax. ¿Quieres algo como esto:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/> 
+0

¿Qué sucede si YourAssembly no está contenido dentro de la ruta de la aplicación? – EngineerSpock

+0

@ Engineer Spock: entonces el CLR no lo encontrará sin ayuda (nada específicamente relacionado con WPF). Agregue rutas de prueba a su * app.config *, o conéctelo a 'AppDomain.AssemblyResolve' para ayudarlo a encontrar el ensamblaje. –

+1

¿Debo agregar una ruta de prueba si el proyecto YourAssembly está en el mismo nivel que el proyecto de la aplicación que necesita hacer referencia a YourAssembly? Por ejemplo, C: \ Solution \ AppProject \ y C: \ Solution \ YourAssemblyProject \ – EngineerSpock

88

Un ejemplo, sólo para hacer esto unas 15 segundos respuesta -

Digamos que tiene "styles.xaml" en una biblioteca WPF llamado "común" y que desea utilizar desde su proyecto de aplicación principal:

  1. agregar una referencia del proyecto principal de proyecto "común"
  2. su App.xaml debe contener:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Saludos

+2

¿Y cómo hace que los recursos definidos en styles.xaml estén disponibles a través de la ventana Propiedades de Visual Studio 2010? Si selecciono un elemento y luego hago clic en Aplicar recurso para su propiedad de Fondo, solo muestra los colores del sistema y no los definidos en styles.xaml. Pero si escribo el nombre del recurso en XAML, funciona, por lo que se hace referencia a él correctamente. – xr280xr

+0

Solo quería agregar que si hace referencia a ResourceDictionary desde UserControl, entonces necesita agregar una referencia al ensamblado en ambos lugares: en UserControl y en el proyecto de la ventana principal. De lo contrario, obtendrá el error de tiempo de ejecución. – Gattuso

15

sólo de recursos DLL es una opción para usted. Pero no se requiere necesariamente a menos que desee modificar los recursos sin recompilar las aplicaciones. Tener solo un archivo ResourceDictionary común también es una opción. Depende con qué frecuencia cambia y recursos, etc.

<ResourceDictionary Source="pack://application:,,,/ 
    <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/> 

MyAssembly - Sólo nombre de ensamblado sin extensión

FolderStructureInAssembly - Si sus recursos están en un folde, especifique estructura de carpetas

Cuando usted está haciendo esto, es mejor saber siteOfOrigin también.

WPF admite dos autorizaciones: application: /// y siteoforigin: ///. La autorización de la aplicación: /// identifica los archivos de datos de aplicación que se conocen en el momento de la compilación, , incluidos los archivos de recursos y de contenido. El siteoforigin: /// authority identifica los archivos del sitio de origen. El alcance de cada autoridad se muestra en la siguiente figura.

enter image description here

4

El uso de XAML:

Si conoce la otra estructura assembly y desea que el resources en C# código, a continuación, utilizar por debajo de código:

ResourceDictionary dictionary = new ResourceDictionary(); 
dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute); 
foreach (var item in dictionary.Values) 
{ 
    //operations 
} 

Salida: Si queremos usar ResourceDictionaryRD1.xaml del proyecto WpfControlLibrary1 en el proyecto StackOverflowApp.

Estructura de proyectos:

Structure of Projects

diccionario de recursos: Resource Dictionary

Código de salida:

Output

PS: Todo ResourceDictionary archivos debe tener Build Action como 'Resource' o 'Page'.

El uso de C#:

Si alguien quiere la solución en términos puramente código C# luego ver mi this solution.

4

Para uwp:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" /> 
Cuestiones relacionadas