【问题标题】:Global Event for ChildWindow_LoadedChildWindow_Loaded 的全局事件
【发布时间】:2012-05-05 03:46:03
【问题描述】:

我偶然发现了如何创建一个全局事件的答案,该事件将在另一个父窗口显示子窗口时触发。我想要一个事件处理程序,所有这些子窗口都可以使用它而不将它(事件处理程序)附加到每个子窗口。

这在 WPF 中是否可行?如果可能的话,任何帮助将不胜感激谢谢:)

【问题讨论】:

    标签: c# wpf linq childwindow


    【解决方案1】:

    不可能以“全局”方式处理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
            }
        }
    }
    

    【讨论】:

    • 嗨@DmitryG,感谢您让我知道它是一个直接事件处理程序。我能知道这段代码背后的逻辑是什么吗?谢谢:)
    • @AllanChua:有一个简单的逻辑:在您的应用程序中创建和显示的每个窗口都会收到 Load 事件的通知。此事件将通过调度程序操作异步传递。我的代码挂钩此操作完成,因此可以在处理此事件后对 Window.Loaded 做出反应。我已经使用反射来访问有关已创建窗口的私人信息...
    猜你喜欢
    • 2016-04-14
    • 2011-09-01
    • 2010-10-30
    • 2012-06-15
    • 2012-06-15
    • 2016-10-30
    • 2012-07-06
    • 2023-03-10
    • 2014-11-22
    相关资源
    最近更新 更多