【问题标题】:Screen does not close even though Caliburn says it's deactivated and closed即使 Caliburn 说它已停用并关闭,屏幕也不会关闭
【发布时间】:2016-12-12 14:01:01
【问题描述】:

当想用this.TryClose() 关闭屏幕(MyViewModel)时,Caliburn 会记录它被停用和关闭:

Caliburn 信息:[2016-12-12T14:43:05.4275321+01:00] 停用 MyViewModel。

Caliburn 信息:[2016-12-12T14:43:05.4275321+01:00] 关闭 MyViewModel。

但屏幕没有关闭。它还在那里,我什至可以与上面的按钮进行交互。

屏幕在导体类中被激活:

public class ShellViewModel : Conductor<Screen>.Collection.OneActive
{
    // [...]
    ChangeActiveItem(new MyViewModel(), false);
    // [...]
}

当我现在尝试从导体类关闭活动屏幕(此时为MyViewModel)时:

ActiveItem.TryClose();

它会正确关闭。

那么,即使 Caliburn 说它正在关闭屏幕,在其类中使用 this.TryClose() 时,屏幕怎么可能不会关闭。但是当试图从指挥类中关闭它时它会正确关闭?
有趣的是,我有另一个 ViewModel 具有完全相同的代码,并且它可以按预期工作。

注意:
MyViewModel 类中,我在OnActivate() 方法中调用this.TryClose()

protected override void OnActivate()
{
   base.OnActivate();
   // do some stuff
   this.TryClose();
}

所以基本上屏幕应该会立即弹出并关闭。

另一个注意事项:
当我在MyViewModel 中调用this.TryClose() 之后尝试在指挥中调用ActiveItem.TryClose() 时,指挥中的调用也停止工作,来自Caliburn 的日志消息:

Caliburn INFO:[2016-12-12T14:57:11.9553219+01:00] TryClose 需要父 IConductor 或具有 Close 方法或 IsOpen 属性的视图。

【问题讨论】:

    标签: c# wpf caliburn.micro


    【解决方案1】:

    显然,激活屏幕后this.TryClose() 调用来得太快了。在 TryClose() 调用之前放置 Task.Delay(50) 时,它工作得很好。
    它在具有相同代码的另一个 ViewModel 中工作的原因是代码需要更多时间来执行。

    仍然不知道 Caliburn 这样做的确切原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多