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?


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"/>

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


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í


8

Para UWP:

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.