如何自行编程 WPF 中存在的系统等路由事件? [关闭]

Posted

技术标签:

【中文标题】如何自行编程 WPF 中存在的系统等路由事件? [关闭]【英文标题】:How to program routed events like system present in WPF on my own? [closed] 【发布时间】:2020-06-14 23:05:59 【问题描述】:

WPF 具有出色的路由事件架构。甚至事件也不必在任何特定对象中。像 Button.Clicked 可以在父 Stackpanel 中处理。您可以使用 e.Handled = true 来阻止它路由或冒泡。它如何知道如何路由事件。所有这一切都不同于正常事件。关于我的一切似乎都很神奇。我想知道如何在 C# 中自己创建这样的系统。是否有任何我应该了解的设计模式或任何解释这种架构的好博客。

【问题讨论】:

【参考方案1】:

在您的 UI 中,每个对象都有对其父对象的引用,例如 Window <- Grid <- Button

最简单的调度代码会从触发事件的元素开始,然后让它冒泡直到它被处理。

// Pseudocode
HandleLocally(sender, e);
if(!e.Handled) 
    Parent.HandleBubbledEvent(sender, e);

当然,这不是 WPF 的工作方式 - WPF 要复杂得多。 WPF creates an "EventRoute" 来自依赖对象图,然后调用路由中的所有处理程序。一些处理程序被调用even for events that are marked as handled。

【讨论】:

【参考方案2】:

我不了解博客,但 wpf 元素的代码在 referencesource.microsoft.com 上是可读的。

编辑:

有时他们会在grid.cs line 488 中解释元素的工作原理。

【讨论】:

以上是关于如何自行编程 WPF 中存在的系统等路由事件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

WPF编程宝典之路由事件

如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

WPF的路由事件

WPF事件内置路由事件

WPF 自定义路由事件问题

wpf中combox的点击事件是啥