2011-10-28 55 views
4

我目前正在进入WPF和Caliburn.Micro,目前没有像MEF或Autofac这样的东西。Caliburn.Micro - 当视图变得可见时做某些事情

现在我试图在视图变为可见状态后立即在viewmodel中执行一些代码。

在相关教程这个代码显示显示视图之前一个消息:

protected override void OnActivate() 
{ 
    MessageBox.Show("Page Two Activated"); //Don't do this in a real VM. 
    base.OnActivate(); 
} 

艾森伯格先生则写道的:

请记住,如果您有任何激活逻辑是取决于已加载的 视图,您应该覆盖Screen.OnViewLoaded 而不是/结合OnActivate。

这是我有:ActionMessage的:

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

我还通过网格EventTrigger和CAL试了一下。 但是在所有三种情况下,MessageBox在视图可见之前出现。

当然,我错过了什么,我做错了什么?

+0

C.M在您实际在屏幕上看到它们之前创建您的视图实例。 (也就是说,C.M不会延迟加载这些)因此,在您实际查看视图之前,将运行OnViewLoaded代码。我认为OnActivate应该是它的正确位置,而不是OnViewLoaded。 您是否尝试过沙盒这种特殊行为? – EtherDragon

+0

感谢您的回答。我不知道你是什么意思的沙盒,但如果我把OnActivate中的MessageBox代码也显示在视图可见之前。如果我把它放在我的Overidden OnViewAttached中,它会强制OnViewLoaded被更快地执行,从而导致出现工作的东西。但是,如果我把其他代码放在那里,它仍然会在视图可见之前执行。 – user1018465

+0

@EtherDragon,那么CM什么时候实际实例化VIEW?它是否在启动时全部实现它们? – JobaDiniz

回答

1

也许不是最优雅的解决方案,但我想你可以从代码隐藏中做到这一点,因为 - 严格地说 - 这是你在这里试图做的一个非常特别的视图/ gui。例如在OnInitialized或OnRender中。如果您将视图提供给EventAggregator,则可以引发事件并制作视图模型 - 或者您想要的任何类,订阅此事件并执行此操作。或者在显示MessageBox的情况下,你真的不会在视图中有任何其他位置。

+0

那些也不适合我。 Caliburns OnViewAttached看起来最接近我喜欢的,我会看看如果这足够好,或者如果我从它的viewmodel /视图的外侧去。 – user1018465

+0

'OnViewLoaded'似乎是'OnShown'的最佳选择 – FindOutIslamNow

相关问题