显示一个子虚拟机,然后在第一个关闭后显示另一个子虚拟机

2024-03-04

我有一位家长指挥。我想显示其中的第一个视图模型。然后在第一个关闭后(即完成一些操作),我想显示一个不同的视图模型。

我在用着Caliburn.Micro.Contrib https://github.com/kmees/CMContrib,其中一个行为结果在 a 中显示子 VM导体。它有一个很酷的扩展方法关闭后执行,它在该子进程停用并关闭后运行一个协程。

但是,当我使用运行另一个 ConductResult 时AfterClosingDo,基本上会发生这种情况:

  • 第一个子 VM  已关闭
  • 发生停用事件,ConductResult 运行 AfterClosing 操作
  • 在 AfterClosing 中,我使用父 Conductor 中的 ConductResult 打开第二个子虚拟机
  • 第二个子虚拟机已正确激活
  • 但是,第一个子虚拟机的停用仍未完成,并且null项目在 Conductor 中设置为活动状态

第一个虚拟机基本上显示加载操作的进度,第二个虚拟机显示实际数据。加载完成后,我想显示父 Conductor 中的数据(当然使用第二个虚拟机)。

所以,我的问题是:有没有一种干净的方法可以做到这一点Caliburn.Micro,最好不要覆盖 Conductor、Screen 等的默认行为。

我正在考虑使用事件聚合器,虽然我不确定这是否是最好的解决方案。


我遇到了一个非常类似的问题,我有一个指挥者打开了一个子虚拟机,然后会弹出一个确认框,提示“您想关闭吗”,并触发了原始项目的回调CanClose方法与您描述的效果相同。

弹出虚拟机将关闭,但在关闭时它将触发一个回调,该回调应该关闭第一个虚拟机。

我的指挥最终重新激活了原来的虚拟机,这很烦人。事件的顺序是:

  • 打开虚拟机1
  • 尝试关闭虚拟机 1
  • CanClose 保护方法被触发
  • VM 1 的 CanClose 中弹出 VM 2(使用相同的导线)
  • 单击虚拟机 2 上的确认按钮
  • 确认按钮触发 CanClose 回调并关闭 VM1
  • VM2 关闭
  • Conductor 记得 VM 1 在 VM 2 之前处于活动状态,因此在 VM 1 关闭后重新打开它

最后我只是实现了一个在关闭后触发的接口。

关闭后有工作要做的子项实现该接口(IAfterClose)

然后我提供了一个覆盖DeactivateItem在导体上:

    public override void DeactivateItem(IScreen item, bool close)
    {
        var afterClose = item as IAfterClose;

        base.DeactivateItem(item, close);

        if (afterClose != null && close)
            afterClose.AfterClose();
    }

这确保了回调不会过早被触发。不确定这是否会让您受益(因为我没有使用 contrib 库),但它可能会给您一些想法。

唯一的缺点是我必须修复DefaultCloseStrategy当回调触发时,它会抛出一个空引用异常。我应用的修复似乎没有造成不良影响,但我并没有真正研究为什么抛出空引用异常。

我找不到任何其他方法来执行此操作,因为最后一个触发的事件似乎是停用事件,而且它们还为时过早。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示一个子虚拟机,然后在第一个关闭后显示另一个子虚拟机 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐