2010-07-15 27 views
3

J'ai récupéré mes mains MEF depuis une semaine et j'essaye de créer une application WPF qui charge les commandes importées de MEF.Impossible d'afficher l'application WPF lors de la configuration manuelle de MainWindow et de l'application de composition (MEF)

J'ai créé un projet d'application WPF et supprimé la fenêtre par défaut et l'URI de démarrage de l'application. Ensuite, je me suis occupé de l'événement démarrage de l'application pour composer l'application:

public partial class App : Application, IPartImportsSatisfiedNotification 
{ 
    {...} 

    private void App_Startup(object sender, StartupEventArgs e) 
    { 
     this.Compose(); 
    } 

    public void Compose() 
    { 
     try 
     { 
      globalCatalog.Catalogs.Add(new DirectoryCatalog(extensionsDirectoryPath)); 
      CompositionContainer container = new CompositionContainer(globalCatalog); 
      container.ComposeParts(this); 
     } 
     catch (Exception ex) 
     { 
      // Do something 
     } 
    } 

    {...} 
} 

En fait, lors du débogage et regarder des objets après que les importations sont satisfaits, tout a bien hiérarchisés comme composé que je voulais. Mais lorsque je tente de montrer la MainWindow de l'application d'une exception est levée sur appel MainWindow.Show():

«. Élément spécifié est déjà l'enfant logique d'un autre élément Déconnecter d'abord »

Bien que mon code dans la méthode OnImportsSatisfied semble bien que cela fonctionne quand ne pas utiliser MEF mécanisme:

public void OnImportsSatisfied() 
{ 
    Window mainWindow = new Window(); 
    mainWindow.Content = this.importedControl; 
    this.MainWindow = mainWindow; 
    this.MainWindow.Show(); 
} 

J'insiste sur le fait que cela fonctionne parfaitement lorsqu'ils ne sont pas importer des commandes avec MEF. Ce qui est surprenant est que ce code ne fonctionne pas trop:

Window mainWindow = new Window(); 
//mainWindow.Content = this.importedControl; 
this.MainWindow = mainWindow; 
this.MainWindow.Show(); 

Je soupçonne que ComposeParts fait un peu plus que ce qu'il dit qu'il est le seul membre agissant sur mon instance d'application réelle.

J'espère que quelqu'un peut m'aider (Glenn?). Merci.


Edit:

J'ai découvert que lorsque je retire l'interface IPartImportsSatisfiedNotification de mes pièces, pas d'exception est levée et la fenêtre apparaît. Mais bien sûr, la fenêtre est vide car j'ai besoin de cette méthode OnImportsSatisfied pour définir le DataContext de la fenêtre sur son modèle de vue importé associé.

Répondre

0

J'ai finalement découvert que j'importais mes contrôles utilisateur WPF en utilisant le constructeur ImportAttribute par défaut, qui en fait fera une instance partagée de la classe si la politique de création n'est pas spécifiée pendant l'export. Et comme plusieurs de mes contrôles implémentaient la même interface et que je les liais dans mes vues, j'essayais en fait d'ajouter cette instance de contrôle utilisateur partagé à différents éléments visuels, ce qui n'est pas autorisé par WPF (et donc l'exception).

J'ai marqué mes importations en utilisant RequiredCreationPolicy défini sur NonShared et tout est revenu dans l'ordre! C'était tout au sujet de l'apprentissage ...

MEF