ChildWindow_Loaded全球活动

本文关键字:活动 Loaded ChildWindow | 更新日期: 2023-09-27 18:33:11

我偶然四处寻找如何创建一个全局事件的答案,每当另一个父窗口显示一个子窗口时,就会触发该事件。我想有一个事件处理程序,它将由所有这些子窗口使用,而无需将其(事件处理程序)附加到每个子窗口。

这在 WPF 中甚至可能吗?如果可能的话,任何帮助将不胜感激:)

ChildWindow_Loaded全球活动

不可能以"全局"方式处理 Window.Loaded 事件,因为它的路由类型是"直接"。直接路由事件不遵循路由,它们仅在引发它们的同一元素中处理。Hovewer 您可以使用以下技巧来处理应用程序中的任何窗口创建:

    // Main window initialization code 
    _argsField = typeof(DispatcherOperation).GetField("_args",
        BindingFlags.NonPublic | BindingFlags.Instance);
    Dispatcher.Hooks.OperationCompleted += Hooks_OperationCompleted;
}
FieldInfo _argsField;
void Hooks_OperationCompleted(object sender, DispatcherHookEventArgs e) {
    if(e.Operation.Priority == System.Windows.Threading.DispatcherPriority.Loaded) {
        var source = _argsField.GetValue(e.Operation) as System.Windows.Interop.HwndSource;
        if(source != null) {
            Window w = source.RootVisual as Window;
            // ... here you can operate with newly created window
        }
    }
}