如何找出谁没有处理事件

How to find out who did not handle an event

我们有一个用 C# 构建的相当大的应用程序/WPF/Prism。该应用程序有一些静态模块和未知数量的动态加载模块。

我的影响范围是静态模块和 shell。

我被要求实现一个将重启 shell 的功能,但只有在查询所有当前打开的模块是否允许重启之后。如果至少有一个模块表示不允许(例如:仍未保存的更改),则重新启动将被推迟。

现在 shell 和模块通过 EventAggregator 进行通信。这意味着我可以发布一个事件,然后查看是否有任何订阅者拒绝或允许重新启动。

这对我可以更改的所有模块都非常有效。但是,我无法更改动态模块(不同的团队,不同的源代码管理)。

一个要求是,如果任何模块支持这个新功能,它应该被视为拒绝重新启动。

明显的问题是,我如何发现某人没有订阅该活动?

尽管所有视图模型都实现了我们的 IViewModel 接口,但我看不出有多少视图模型当前存在(因此我至少可以查看是否所有视图模型都允许,或者是否缺少某些答案)。

我可能会发现,有多少 模块 支持它,但即便如此,这也没有说明当前有多少视图模型 open/existing/used 视图。

有没有办法在不更改所述视图模型的情况下查明活动视图模型是否不支持此功能?

您可以随时查看 IRegionManager.Regions 以找到所有现有区域。集合中的每个 IRegion 都有 IRegion.ActiveViews,它给出了该区域中所有当前活动视图的列表。然后可以检查每个视图(它是一个对象)是否附加了一些属性或实现了一些接口。然后,如果视图是 FrameworkElement,您还可以检查它的 DataContext。

如果您发现没有 attribute/interface 的视图,该视图不支持重新启动。如果视图有 attribute/interface,则查询该接口。

如果您创建额外的(范围内的)区域经理,您将需要跟踪他们。您维护一个活动区域经理列表,最初仅包含附加到 shell 的区域经理。在检查视图时,如果视图是一个 FrameworkElement 并且附加了区域管理器并且附加的区域管理器不在列表中,则将其添加到列表并使用相同的算法检查由该区域管理器控制的视图。