Caliburn Micro を使用して WPF アプリケーションを開発しています。このアプリケーションのいくつかのビューは、AutoCAD 環境にロードする必要があります。AutoCAD プログラミング環境では、(タイプ dll の) AutoCAD プラグインを開発し、それらを AutoCAD 環境にロードできます。
AutoCAD プラグイン タイプ (dll) のため、プラグインにはアプリケーション オブジェクトがありません。そのため、ブートストラップをカスタマイズする必要があります。Caliburn Micro のドキュメント(「Office および WinForms アプリケーションでの Caliburn.Micro の使用」まで下にスクロール)によると、非汎用ブートストラップを継承し、基本コンストラクターの「useApplication」パラメーターに「false」を渡すことができます。そこで、カスタマイズしたブートストラッパーを作成しました。
問題は、ConfigureContainer() オーバーライドが呼び出されず、何も初期化されないことです。また、ViewModel の最初の概念を使用して ShellView を読み込む方法がわかりません。ここに私が今まで思いついたいくつかのコードがあります。
ブートストラップ
public class AutocadMefBootStrapper : Bootstrapper {
private CompositionContainer container;
private ElementHost host;
public AutocadMefBootStrapper(ElementHost host) : base(false) {
this.host = host;
}
protected override void Configure() { //Not getting invoked.
...
var rootViewModel = container.GetExportedValue<IShell>();
var rootView = ViewLocator.LocateForModel(rootViewModel, null, null);
host.Child = rootView;
}
}
要求されたときに AutoCAD がロードする Windows フォームがあります。Windows フォームのロード イベントで、カスタム化された caliburn マイクロ ブートストラップのインスタンスを作成し、ブート ストラップがすべての魔法を実行してシェルをロードすることを期待します。しかし、シェルはロードされません。AutoCAD に空白のウィンドウが表示されます。Windows フォームのコーディング方法を次に示します。
public partial class WinFormHost : Form {
private void WinFormHost_Load(object sender, EventArgs e) {
ElementHost host = new ElementHost();
host.Dock = DockStyle.Fill;
Controls.Add(host);
AutocadMefBootStrapper bootStrapper = new AutocadMefBootStrapper(host);
}
}
これが私のShellViewです
<UserControl x:Class="RelayAnalysis_Autocad.Views.ShellView"
...
<Grid>
<TextBlock>Hello There</TextBlock>
</Grid>
</UserControl>
および ShellViewModel
[Export(typeof(IShell))]
public class ShellViewModel : Conductor<object>, IShell {
protected override void OnActivate() {
base.OnActivate();
}
}
要約すると、Application オブジェクトを使用してロードされていないホスト環境で Caliburn Micro を使用しようとしています。ShellView がロードされないため、Caliburn Micro を構成できません。