2017-01-31 10 views
0

Я использую Prism 6.1.0 в первый раз. Я создал новый проект WPF, чтобы попробовать вкус новейшей призмы.Prism 6.1.0 реализация MefBootstrapper: метод CreateShell генерирует исключение

Моя оболочка выглядит следующим образом:

<Window x:Class="Prism.Shell" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Prism" 
    mc:Ignorable="d" 
    Title="Shell" 
    Height="300" 
    Width="300"> 
<Grid Background="HotPink"></Grid> 

using System.ComponentModel.Composition; 
using System.Windows; 

namespace Prism 
{ 
    /// <summary> 
    /// Interaction logic for Shell.xaml 
    /// </summary> 
    [Export] 
    public partial class Shell : Window 
    { 
     public Shell() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Bootstrapper:

using Prism.Mef; 
using System.ComponentModel.Composition.Hosting; 
using System.Windows; 

namespace Prism 
{ 
    public class MyBootstrapper : MefBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      return Container.GetExportedValue<Shell>(); 
     } 
     protected override void InitializeShell() 
     { 
      base.InitializeShell(); 
      Application.Current.MainWindow = (Window)Shell; 
      Application.Current.MainWindow.Show(); 
     } 
     protected override void ConfigureAggregateCatalog() 
     { 
      base.ConfigureAggregateCatalog(); 
      AggregateCatalog.Catalogs 
       .Add(new AssemblyCatalog(typeof(MyBootstrapper).Assembly)); 
     } 
    } 
} 

и App C# код является:

using System.Windows; 
namespace Prism 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 
      (new MyBootstrapper()).Run(); 
     } 
    } 
} 

После этой линии: enter image description here У меня есть исключение: Exception брошенный: «System.InvalidOperationException» в PresentationCore.dll Дополнительной информации: Вызывающий поток должен быть STA, так как многие компоненты пользовательского интерфейса требуют этого. enter image description here

Кто-нибудь знает, как это исправить?

ответ

0

Исключение указывает, что ваш конструктор окон вызывается другим потоком. В мире WPF каждый элемент управления: окно, кнопка и т. Д. Должен быть создан одним специальным потоком, называемым STAThread. Кроме того, только STAThread может обращаться к элементам управления пользовательским интерфейсом (если другой поток делает это, то же самое будет InvalidOperationExcepiotion). Таким образом, похоже, что где-то вы вызываете новый поток. Я не вижу ошибки в вашем коде, я также не знаю, запускает ли ваш контейнер какой-либо поток. Но убедитесь, что вы не создаете подозрительный поток в вашем коде.

Также смотрите StartupURI в App.xaml. Он не должен устанавливаться, если вы используете контейнер DI. Но я думаю не об этом.

Я создал пример приложения, я скопировал ваш код, и он работает. Так что ваша ошибка - что-то странное.

+0

Когда я использовал призму 4.0, он работает. Спасибо за попытку. –

+0

Я тестировал его на новейшей Prism 6.2 – bakala12