ResourceDictionary en un ensamblaje separado

245

Tengo archivos de diccionario de recursos (MenuTemplate.xaml, ButtonTemplate.xaml, etc.) que quiero usar en múltiples aplicaciones separadas. Podría agregarlos a los ensamblajes de las aplicaciones, pero es mejor si compilo estos recursos en un solo ensamblaje y mis aplicaciones hacen referencia a ellos, ¿verdad?

Después de compilar el ensamblado de recursos, ¿cómo puedo hacer referencia a él en el App.xaml de mis aplicaciones? Actualmente uso ResourceDictionary.MergedDictionaries para fusionar los archivos de diccionario individuales. Si los tengo en un ensamblaje, ¿cómo puedo hacer referencia a ellos en xaml?

Gus Cavalcanti
fuente
1
Esto puede ser una exageración, pero es posible que desee preparar sus recursos para la exportación utilizando la técnica descrita aquí: alexfeinberg.wordpress.com/2015/08/16/… . La principal ventaja de hacer esto es evitar problemas con múltiples versiones del ensamblado de recursos que se cargan en el mismo dominio de aplicación.
user195275

Respuestas:

353

Consulte la sintaxis de URI del paquete . Quieres algo como esto:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Kent Boogaart
fuente
1
¿Qué sucede si YourAssembly no está contenido dentro de la ruta de la aplicación?
SaneDeveloper
@Ingeniero Spock: entonces el CLR no lo encontrará sin ayuda (nada específicamente relacionado con WPF). Agregue rutas de sondeo a su app.config o adjúntelo AppDomain.AssemblyResolvepara ayudarlo a encontrar el ensamblado.
Kent Boogaart
1
¿Necesito agregar una ruta de prueba si el proyecto YourAssembly está al mismo nivel que el proyecto de aplicación que necesita hacer referencia a YourAssembly? Por ejemplo, C: \ Solution \ AppProject \ y C: \ Solution \ YourAssemblyProject \
SaneDeveloper
1
@EngineerSpock: esta es una pregunta separada, así que abre una.
Kent Boogaart
2
Esta respuesta no tiene sentido. ¡Para seguirlo, uno ya necesita saber cómo hacerlo!
usuario1040323
97

Un ejemplo, solo para hacer de esto una respuesta de 15 segundos:

Supongamos que tiene "styles.xaml" en una biblioteca WPF llamada "común" y desea usarlo desde su proyecto de aplicación principal:

  1. Agregue una referencia del proyecto principal al 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>

Salud

Hertzel Guinness
fuente
2
¿Y luego 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 Fondo, solo muestra SystemColors y no los definidos en styles.xaml. Pero si escribo el nombre del recurso en XAML, funciona, por lo que está correctamente referenciado.
xr280xr
Solo quería agregar que si hace referencia a ResourceDictionary desde UserControl, debe agregar una referencia al ensamblaje en ambos lugares: en UserControl y en el proyecto de la ventana principal. De lo contrario, obtendrá el error de tiempo de ejecución.
Andrejs Gasilovs
16

La DLL de solo recursos es una opción para usted. Pero no se requiere necesariamente a menos que desee modificar recursos sin volver a compilar aplicaciones. Tener solo un archivo ResourceDictionary común también es una opción. Depende de la frecuencia con la que cambie los recursos, etc.

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

MyAssembly : solo nombre de ensamblado sin extensión

FolderStructureInAssembly : si sus recursos están en una carpeta, especifique la estructura de carpetas

Cuando esté haciendo esto, también es mejor conocer siteOfOrigin .

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

ingrese la descripción de la imagen aquí

CharithJ
fuente
8

Para UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
Gianluca Demarinis
fuente
4

Usando XAML:

Si conoce la otra assemblyestructura y desea el código resourcesin c # , utilice el siguiente 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 utilizar ResourceDictionary RD1.xamlProject WpfControlLibrary1en StackOverflowAppproyecto.

Estructura de proyectos :

Estructura de proyectos

Diccionario de recursos: Diccionario de recursos

Código de salida:

Salida

PD: Todos los ResourceDictionaryarchivos deben tener Build Actioncomo ' Resource' o ' Page'.

Usando C #:

Si alguien quiere la solución en código puramente C # , vea mi solución.

Kylo Ren
fuente