2012-05-10 22 views
5

Tengo un componente MEF de importación que se carga dinámicamente cuando se abre el asistente de importación. Tan pronto como el usuario seleccione el tipo de importación que desea procesar, el control sobre el diálogo del asistente de importación se pasa al componente de importación elegido. Por supuesto, los componentes de importación deben suministrar recursos al cuadro de diálogo del asistente (por ejemplo, DataTemplate s). Por el momento esto se implementa a través de DataTemplateSelector s que son proporcionados por los componentes de importación. Acceden a un ResourceDictionary local del ensamblaje del componente de importación.Cómo proporcionar recursos XAML a partir de componentes MEF

Pero como se puede imaginar, esto es tedioso: Tengo que añadir código para cada DataTemplate que proporcionaran, WPF no utiliza automáticamente el derecho DataTemplate por el tipo de la ViewModel se está visualizando.

¿Alguien ha resuelto este problema antes? ¿Cómo pueden ustedes proporcionar recursos en un entorno de plug-in?

Gracias por cualquier ayuda con anticipación.

Saludos

Respuesta

13

Perdí la pista de dónde encontré este pequeño truco, pero una cosa que puedes hacer es importar dinámicamente diccionarios de recursos cuando compones ensamblajes externos.

En cada conjunto de recursos, exportar uno o más ResourceDictionary objetos yendo código detrás y anotar así:

[Export(typeof(ResourceDictionary))] 
public partial class Resources : ResourceDictionary 
{ 
    public Resources() 
    { 
     InitializeComponent(); 
    } 
} 

Ahora necesita un componente que resuelve un [ImportMany] IEnumerable<ResourceDictionary> resourceDictionaries y hacer algo como esto:

 //Merge exported resource dictionaries from all composed sources into the application 
     foreach (var resourceDictionary in resourceDictionaries) 
     { 
      Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); 
     } 
+0

Básicamente le di una oportunidad a esa idea. Respaldo mi 'ResourceDictionary' con un archivo de clase, por lo que podría crear una instancia fácilmente. Una página de asistente ahora puede fusionar ese diccionario para "importar" sus recursos. Muchas gracias. – oddparity

+0

La idea general de tener un código detrás de un diccionario de recursos es bastante nuevo para mí ... esto abre todo un mundo de oportunidades, bueno. – grek40

0

Si su componente importado estará contenida sólo en la región específica de la aplicación, entonces se podría agregar sólo DataTemplate de modelo de vista de la raíz del componente a los recursos de un FrameworkElement que representa una región donde la componente ser localizado. El resto de DataTemplates (para otros ViewModels en el componente importado) se incluiría en los recursos de DataTemplate para el modelo de vista raíz del componente.

+0

Esto implica que declaro 'DataTemplate' para la raíz del componente' ViewModel' en el programa principal, ¿verdad? Me gustaría tener esos "detalles de implementación" del componente situado en el ensamblaje del componente. – oddparity

+0

No. Creo que FrameworkElement que representa la región donde se ubicará el componente se pasará al código del componente como parámetro. Declarar DataTemplate para ViewModel raíz del componente en el programa principal no tendría sentido, ya que no haría la aplicación composable. – Stipo

Cuestiones relacionadas