【发布时间】:2011-10-28 16:48:41
【问题描述】:
我目前正在研究 WPF 和 Caliburn.Micro,目前还没有 MEF 或 Autofac 之类的东西。
现在我正试图在视图变得可见后立即在视图模型中执行一些代码。
在相关教程中,此代码在显示视图之前显示一个消息框:
protected override void OnActivate()
{
MessageBox.Show("Page Two Activated"); //Don't do this in a real VM.
base.OnActivate();
}
先生。艾森伯格接着写道:
请记住,如果您有任何依赖于 视图已经加载,你应该覆盖 Screen.OnViewLoaded 代替/结合 OnActivate。
这就是我所拥有的:
protected override void OnViewLoaded(object view)
{
base.OnViewLoaded(view);
MessageBox.Show("OnPageTwoViewLoaded");
}
我还通过 Grid EventTrigger 和 cal:ActionMessage 进行了尝试。 但在所有三种情况下,MessageBox 都会在视图可见之前出现。
我肯定错过了什么,我做错了什么?
【问题讨论】:
-
C.M 在您实际在屏幕上看到它们之前创建您的视图实例。 (也就是说,C.M 不会延迟加载这些)因此 OnViewLoaded 代码在您实际看到视图之前运行。我认为 OnActivate 应该是它的正确位置,而不是 OnViewLoaded。您是否尝试过对这种特殊行为进行沙箱处理?
-
感谢您的回答。我不知道沙箱是什么意思,但如果我将 MessageBox 代码放在 OnActivate 中,它也会在视图可见之前显示。如果我把它放在我覆盖的 OnViewAttached 中,它会强制 OnViewLoaded 更快地执行,从而导致某些看起来有效的东西。但是,如果我将其他代码放在那里,它仍然会在视图可见之前执行。
-
@EtherDragon ,那么 CM 什么时候实际实例化一个 VIEW?它会在启动时将它们全部实例化吗?
标签: wpf caliburn.micro