2011-10-28 5 views
4

現在、WPFとCaliburn.Microに入っています。現在、MEFやAutofacのようなものはありません。Caliburn.Micro - ビューが表示されたときに何かをする

今、ビューが表示された直後に、ビューモデルでいくつかのコードを実行しようとしています。このコードは、ビューが表示される直前にメッセージボックスを表示し、関連するチュートリアルで

protected override void OnActivate() 
{ 
    MessageBox.Show("Page Two Activated"); //Don't do this in a real VM. 
    base.OnActivate(); 
} 
氏アイゼンバーグは、この書き込み

は、あなたが任意の活性化ロジックを持っている場合には、覚えておいてください ビューが既に読み込まれていることに依存して、OnActivateとの組み合わせではなくScreen.OnViewLoaded を上書きする必要があります。

これは私が持っているものです:ActionMessage:

protected override void OnViewLoaded(object view) 
{ 
    base.OnViewLoaded(view); 
    MessageBox.Show("OnPageTwoViewLoaded"); 
} 

は、私はまた、グリッドEventTriggerおよびCALを経由して、それを試してみました。 しかし、3つのケースでは、ビューが表示される前にMessageBoxが表示されます。

確かに何か不足していますが、何が間違っていますか?

+0

C.Mは実際に画面上に表示する前にビューインスタンスを作成します。 (つまり、C.Mはこれらを遅延ロードしません)。実際にビューを表示する前にOnViewLoadedコードが実行されます。私はOnActivateがOnViewLoadedではなく正しい場所であるべきだと思います。 この特定の動作をサンドボックスで試しましたか? – EtherDragon

+0

あなたの答えをありがとう。私はあなたがサンドボックスで何を意味するのかわかりませんが、OnActivateにMessageBoxコードを置くと、ビューが表示される前に表示されるようになります。オーバーライドされたOnViewAttachedに入れた場合、OnViewLoadedはすぐに実行され、動作するように見えます。しかし、そこに他のコードを置くと、ビューが表示される前に実行されます。 – user1018465

+0

@therDragonだから、いつCMが実際にVIEWを開始するのですか?それはスタートアップ時にすべてそれらをinstanciateですか? – JobaDiniz

答えて

1

最も洗練されたソリューションではないかもしれませんが、厳密に言えば、コードビハインドからこれを行うことができますね。これはあなたがここでやろうとしているビュー/ GUI固有のものです。たとえば、OnInitializedまたはOnRender。ビューにEventAggregatorへの参照を渡すと、イベントを発生させてビューモデルを作成することができます。または、必要なクラスを作成し、このイベントに登録してそのことを行うことができます。 MessageBoxを表示する場合は、実際にはView以外の場所には表示されません。

+0

これらは私にとってもうまくいきません。 Caliburns OnViewAttachedは、私が好きなものに最も近いと思われます。十分なことがあるかどうか、またはそのビューモデル/ビューの外側からそれに行くかどうかを確認します。 – user1018465

+0

'OnViewLoaded'は' OnShown'に最適です – FindOutIslamNow

関連する問題