ResourceDictionary en un ensamblaje separado
-
19-08-2019 - |
Pregunta
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 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?
Solución
Consulte la sintaxis de URI del paquete . Quieres algo como esto:
<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Otros consejos
Un ejemplo, solo para hacer de esto una respuesta de 15 segundos -
Digamos que tiene " styles.xaml " en una biblioteca WPF llamada "común" y quieres usarlo desde tu proyecto de aplicación principal:
- Agregue una referencia del proyecto principal a "común" proyecto
- Su app.xaml debe contener:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Saludos
Estoy trabajando con .NET 4.5 y no pude hacerlo funcionar ... Estaba usando la Biblioteca de control personalizado de WPF. Esto funcionó para mí al final ...
<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />
fuente: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19
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 la carpeta
Cuando esté haciendo esto, es mejor saber siteOfOrigin también.
WPF admite dos autoridades: aplicación: /// y siteoforigin: ///. La aplicación: /// autoridad identifica los archivos de datos de la aplicación que son conocidos en tiempo de compilación, incluidos los archivos de recursos y contenido. los siteoforigin: /// la autoridad identifica los archivos del sitio de origen. El alcance de cada autoridad se muestra en la siguiente figura.
Para UWP:
<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
Uso de XAML:
Si conoce la otra estructura de ensamblaje
y quiere los recursos
en el código 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 usar ResourceDictionary
RD1.xaml
del Proyecto WpfControlLibrary1
en StackOverflowApp
proyecto.
Estructura de proyectos :
Salida de código:
PS: Todos los archivos ResourceDictionary
deben tener Build Action
como ' Resource
' o ' Page
'.
Uso de C #:
Si alguien quiere la solución en c # code , simplemente vea mi esto solución.