【问题标题】:Caliburn.Micro - doing something when a view becomes visibleCaliburn.Micro - 当视图变得可见时做一些事情
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 那些也不适合我。 Caliburns OnViewAttached 似乎最接近我喜欢的东西,我会看看这是否足够好,或者我是否从该视图模型/视图之外进行。
  • OnViewLoaded 似乎是OnShown 的最佳选择
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多