2009-09-01 1 views
1

私はPrismを初めて使い、ElementHost内でPrisimコントロールをホストしようとしています。私は何か非常に基本的なものが欠けているようです。私はElementHostを含む単一のWinFormを持っています。次のコードの形式である:ブートストラップはregisrationElementHost内でのPrisimの使用方法

public class Bootstrapper : UnityBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    { 
     Container.RegisterType<MyView>(); 
     var shell = Container.Resolve<Shell>(); 
     return shell; 
    } 

    protected override IModuleCatalog GetModuleCatalog() 
    { 
     ModuleCatalog catalog = new ModuleCatalog(); 
     catalog.AddModule(typeof(MyModule)); 
     return catalog; 
    } 
} 

を扱う

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     Bootstrapper bootstrapper = new Bootstrapper(); 
     bootstrapper.Run(); 

     var child = bootstrapper.Container.Resolve<Shell>(); 
     elementHost.Child = child; 

    } 

MyView.xamlは、この時点ではラベル以外の何ものでもありません。

<ItemsControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion" /> 

モジュールコードが最小である:

Shell.xamlには、以下のXAMLを含んでユーザーコントロールである私は理解しようとプリズムコードに深いトレースしてきた

public class MyModule : IModule 
{ 
    private readonly IRegionViewRegistry _regionViewRegistry; 

    public MyModule(IRegionViewRegistry registry) 
    { 
     _regionViewRegistry = registry; 
    } 

    public void Initialize() 
    { 
     _regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(MyView)); 
    } 
} 

ビューが決してその地域に設定されない理由私は何か基本的なものを欠いています

答えて

4

理由は、プリズムでこのコードです:

private static bool RegionManager::IsInDesignMode(DependencyObject element) 
{ 
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode. 
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null 
     || Application.Current.GetType() == typeof(Application); 
} 

理由は、非WPFアプリケーションのApplication.CurrentがNULLであるということです!

ソリューション:

  1. System.Windows.Applicationから継承する空のクラスを作成します。 (名前は関係ありません):これは

    public class MyApp : System.Windows.Application 
    { 
    } 
    
    if (System.Windows.Application.Current == null) 
    { 
        // create the Application object 
        new MyApp(); 
    } 
    

    です - 今ではありませんApplication.Currentを持っている:

をプラグインへのエントリーの時点で、次のコードを実行nullであり、typeof(Application)と等しくありません。

+0

あなたは私の一日をします。この興味深いハックも私のために働く:-) –

0

@マーク・リンデル上記は私のために働いた。私が変更しなければならなかった唯一の事は以下の通りです。

私のブートストラップ

public class Bootstrapper : UnityBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      return this.Container.Resolve<Shell>(); 
     } 

     protected override void InitializeShell() 
     { 
      base.InitializeShell();  
      if (System.Windows.Application.Current == null) 
      { 
       // create the Application object 
       new HelloWorld.Myapp(); 
      } 

      //App.Current.MainWindow = (Window)this.Shell; 
      //App.Current.MainWindow.Show(); 
      //MainWindow = (Window)this.Shell; 

     }  

     protected override void ConfigureModuleCatalog() 
     { 
      base.ConfigureModuleCatalog(); 

      ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; 
      moduleCatalog.AddModule(typeof(HelloWorldModule.HelloWorldModule)); 
     } 

と私のフォームクラス

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //Create the ElementHost control for hosting the WPF UserControl 
      ElementHost host = new ElementHost(); 
      host.Dock = DockStyle.Fill; 

      Bootstrapper bootstrapper = new Bootstrapper(); 
      bootstrapper.Run(true); 

      //var uc = bootstrapper.Container.Resolve<Shell>(); This line threw error 

      //Create the WPF UserControl.   

          HelloWorld.Shell uc = new HelloWorld.Shell(); 

      //Assign the WPF UserControl to the ElementHost control's Child property. 
      host.Child = uc; 

      //Add the ElementHost control to the form's collection of child controls. 
      this.Controls.Add(host); 
     } 
    } 


     } 

そして、ちょうど明確にするために、私はシェルを含むWPF PRISMアプリケーションでクラスの下に追加。

public class MyApp : System.Windows.Application 
{ 
} 

編集:イベントとダブル cliclロードに行き、プロパティウィンドウで、(フォームの)Loadメソッドハンドラは rightclicking形式で作成する必要があることに注意してください。ロードイベントハンドラをコピーして貼り付けることができません。

関連する問題