2015-12-22 4 views
0

Может кто-нибудь, пожалуйста, покажет мне пример создания контейнера состава MEF в файле app.xaml.cs без использования призмы или консольного приложения, которое не представляет проблем.MEF и WPF без призмы

Exports работает, но импорт не работает, и все примеры, которые я вижу, работают только с Prism, который я не хочу использовать. Импорт будет работать, если в файле App.xaml.cs, но я не понимаю, почему импорт не будет работать в MainWindow.cs, и все в корневой сборке.

Я могу получить его, чтобы составить, если я делаю композицию в конструкторе MainWindow, но я хотел бы составить в app.xaml.cs, если это возможно.

Вот пример (на самом деле я использую mvvm, но этот пример ведет себя так же, как и код).

public partial class App : Application 
{ 
    public App() 
    { 
     ShutdownMode = ShutdownMode = ShutdownMode.OnMainWindowClose; 

    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 



     Compose(); 

     var window = new MainWindow(); 
     window.Show(); 

    } 

    public void Compose() 
    { 
     var catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog(".")); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 
    } 


} 

[Export] 
public class MessagePlugin 
{ 
    public string GetMessage() 
    { 
     return "Successfully composed message"; 
    } 

} 

public partial class MainWindow : Window 
{ 
    [Import] 
    public MessagePlugin plugin { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += MainWindow_Loaded; 

    } 


    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var p = plugin; <-------------------------------NULL 
     MessageBox.Show(p.GetMessage()); 

    } 
} 
+0

Вам необходимо создать [mcve], который иллюстрирует то, что вы пытаетесь сделать. Из этого, люди могут сказать вам, что вы ошибаетесь. – Will

+0

Здесь вы, пример добавлен – Fab

+1

Вы не вызывали 'Compose()' в любом месте App.xaml.cs. Или это опечатка? – vendettamit

ответ

0
public partial class App : Application 
{ 
    private CompositionContainer container; 

    [Import(typeof(Window))] 
    public Window TheMainWindow { get; set; } 


    public App() 
    { 
     ShutdownMode = ShutdownMode = ShutdownMode.OnMainWindowClose; 
    } 


    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     TheMainWindow = new MainWindow(); 

     Compose(); 

     Application.Current.MainWindow = TheMainWindow; 
     Application.Current.MainWindow.Show(); 

    } 

    public void Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(App).Assembly)); 
     container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 
    } 

} 

[Export (TypeOf (Window))] общественного частичного класса MainWindow: Window { [Import] общественного MessagePlugin плагин {получить; задавать; }

public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += MainWindow_Loaded; 

    } 


    private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var p = plugin; 

     if (p != null) 
     { 
      MessageBox.Show(p.GetMessage()); 
     } 
     else 
     { 
      MessageBox.Show("Plugin NOT Composed"); 
     } 


    } 
} 
+0

Зачем добавлять TheMainWindow = new MainWindow(); в методе запуска? – Shelvin