【问题标题】:Difference between OnInitialized and OnSourceInitialized in WPFWPF 中 OnInitialized 和 OnSourceInitialized 的区别
【发布时间】:2019-02-12 17:13:04
【问题描述】:

我试图在 WPF 中添加全局热键。

        var helper = new WindowInteropHelper(this);
        var handle = helper.Handle;
        var source = HwndSource.FromHwnd(handle);

当我将这段代码放在OnInitialized 覆盖方法中时,它会为handle 变量返回值0,并在HwndSource.FromHwnd(handle) 中失败。

但是,当我将它放入 OnSourceInitialized 覆盖方法时,它会为 handle 变量返回一些随机值,并且在 HwndSource.FromHwnd(handle) 中可以正常工作。

我试图理解为什么会出现这种行为。
WPF中的OnInitialized和OnSourceInitialized有什么区别?

【问题讨论】:

标签: c# wpf


【解决方案1】:

FrameworkElement.Initialized 事件在 FrameworkElement(一个 WPF 元素)被初始化时引发。 Here in the docs:

每当EndInitOnVisualParentChanged 方法被调用。调用任何一种方法都可以 来自应用程序代码,或通过可扩展应用程序 标记语言 (XAML) 处理器行为时 XAML 页是 已处理。

这意味着,在处理 XAML 树时会引发此事件。可以为任何FrameworkElement 提出它,包括Window

当底层 Win32 窗口句柄可用时引发 Window.SourceInitialized 事件。它仅在Window 上提出。你可以在HwndSource documentation阅读更多内容。

这就是为什么您在 Window.SourceInitialized 事件处理程序中获得有效句柄和在 FrameworkElement.Initialized 事件处理程序中获得无效句柄 (0) 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2010-11-23
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多