2011-12-21 22 views
16

Tengo una aplicación de prisma y varios módulos. Me pregunto cuál es el mejor lugar para ubicar recursos como estilos, pincel, plantillas de control, plantillas de datos.WPF Prism - ¿Dónde poner los recursos?

¿Debo hacer un único diccionario de recursos y poner todo allí? ¿Debería cada módulo tener sus propios recursos? O cada vista? Me gustaría seguir el objetivo de Prism de mantener todo modular, pero también no veo el sentido de volver a declarar los mismos recursos en cada módulo ...

Respuesta

30

Desarrollo aplicaciones con Prism, y utilizo una técnica muy cercana a descrito en el manual de Prism. Hay proyecto YourApplication.Infrastructure, donde se suelen colocar todas las interfaces compartidas, etc Así que:

  1. Acabo de añadir YourApplication.Resources proyecto
  2. Ahí crear carpetas Temas
  3. Crear archivo XAML separada en carpeta de temas de cada grupo de recursos (como Generic.WPF.xaml para estilos de controles WPF estándar, Generic.Brushes.xaml para pinceles, etc.)
  4. Crear archivo Themes \ Generic.xaml (exactamente con este nombre, agregará grandes beneficios en el futuro) con contenido como

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    
        <ResourceDictionary.MergedDictionaries> 
    
         <ResourceDictionary Source="Generic.Brushes.xaml"/> 
         <ResourceDictionary Source="Generic.WPF.xaml"/> 
    
        </ResourceDictionary.MergedDictionaries> 
    
    </ResourceDictionary> 
    
  5. Ahora puede agregar esos recursos en cualquier módulo (que tiene proyecto separado de ella, ¿verdad?), Añadiendo una referencia a YourApplication.Resources a ese proyecto y añadiendo a xaml de su punto de vista:

    <UserControl.Resources> 
        <ResourceDictionary> 
    
         <ResourceDictionary.MergedDictionaries> 
          <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
         </ResourceDictionary.MergedDictionaries> 
    
         <!-- Put your not shared resource here --> 
    
        </ResourceDictionary> 
    </UserControl.Resources> 
    

No lo sé, quizás esta forma tenga algunos problemas, pero funciona y funciona bien para mí. Si alguien puede comentar de alguna manera de esta manera (pros/contra), ¡estaré encantado de escucharlo!

+0

Hola , sepa que esto es un poco viejo, pero necesitaba comentarlo y pedir un consejo relacionado con esto. Hice algo similar e intenté diferentes nombres simples o avanzados. Los nombres y direcciones parecen ser correctos.Deberíamos registrar algo en el Contenedor o hacer cualquier técnica de inicialización para usar este enfoque. Para mí parece que no pudo encontrar la Asamblea de recursos en tiempo de ejecución? Prisma 4.1, gracias. – LastBye

+1

@Sypress en realidad, este método no usa nada de Prism, es como un prisma. Utiliza solo funciones integradas de WPF y XAML. ¿Cómo exactamente dice que no pudo encontrar? Le muestra un error o simplemente no usa el estilo del ensamblaje (probablemente, el estilo predeterminado)? – chopikadze

+0

No pudo encontrar el ensamblaje, pasé el ensamblaje a través de ms-build y el problema desapareció :) – LastBye

5

recursos propio de una aplicación que suelen poner en un ResourceDictionary, que se añade a cualquiera de App.xaml o StartupWindow.xaml

Recursos para obtener una vista específica se encuentran normalmente con la vista. Por ejemplo, un UserControl que se está utilizando para un CalendarView contendrá cualquier recurso personalizado para el Calendario, como pinceles, estilos, plantillas, etc. específicos del calendario

Normalmente no veo una razón para hacer un módulo- amplios recursos, pero si alguna vez lo hago, tendré un ResourceDictionary para el Módulo que puede cargarse en los diccionarios fusionados de la aplicación en tiempo de ejecución, o incluirse en Vistas individuales en el Módulo.

2

Me gustaría compartir algunos nuevos conocimientos. Estoy usando el enfoque @chopikadze. Y es un enfoque realmente genial. ¡Gracias a ti!

Sin embargo, si usted no quiere escribir cada vez para cada control de estas piezas de código:

<UserControl.Resources> 
    <ResourceDictionary>  
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
     </ResourceDictionary.MergedDictionaries>  
     <!-- Put your not shared resource here -->  
    </ResourceDictionary> 
</UserControl.Resources> 

A continuación, sólo se puede declarar <ResourceDictionary/> en App.xaml de su Bootstrapper así:

<Application.Resources>   
    <ResourceDictionary Source="pack://application:,,,/YourApplication.Resources;component/Themes/Generic.xaml"/> 
</Application.Resources> 
Cuestiones relacionadas