1

子ウィンドウが別の親ウィンドウによって表示されているときに発生するグローバルイベントを作成する方法の答えを探していました。すべての子ウィンドウにアタッチせずに、このすべての子ウィンドウで使用されるイベントハンドラー(イベントハンドラー)が必要です。

これはWPFでも可能ですか?これが可能であれば、助けていただければ幸いです:)

4

1 に答える 1

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
        }
    }
}
于 2012-05-05T04:40:30.140 に答える