我偶然发现了如何创建一个全局事件的答案,当另一个父窗口显示子窗口时,该事件将被触发。我希望有一个所有这些子窗口都可以使用的事件处理程序,而不会将它(事件处理程序)附加到每个子窗口。
这在WPF中是否可行?如果这可能任何帮助将不胜感激:))
答案 0 :(得分:2)
以“全局”方式处理Window.Loaded事件是不可能的,因为它的路由类型是“直接”的。直接路由事件不遵循路由,它们仅在引发它们的同一元素内处理。 您可以使用以下技巧来处理应用程序中的任何窗口创建:
// 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
}
}
}