在没有子控件实例的情况下订阅任何冒泡的 WPF 子控件路由事件

问题描述

我有一个 WPF 自定义控件,其中包含一个显示多个子对象和(可能)ItemsControl 的画布。我不知道会有多少子对象或它们将如何嵌套。

但我需要此控件来捕获来自任何子 Thumb.DragCompleted 的任何“冒泡”Thumb 事件。问题是,它没有任何要订阅Thumb 控件的特定实例。它只需要捕获事件并在拇指满足特定条件时采取特定操作即可。

是否可以在代码隐藏中订阅所有此类子事件?我能看到的最接近的似乎是 EventManager.RegisterClassHandler,但我不希望应用程序中的每个拇指都使用 DragCompleted,只想要我的子对象的拇指。我一定遗漏了一些明显的功能,是吗?

我发现的示例似乎期望您实际上拥有一个 Thumb 控制对象实例。

解决方法

您可以像这样在 XAML 中订阅冒泡类型的路由事件:

<Grid Name="ParentGrid" Thumb.DragCompleted="DragCompletedEventHandler">
    <!--Some children possibly containing a Thumb-->
</Grid>

在上面的示例中,引发其 Thumb 事件的 ParentGrid 中的任何 DragCompleted 最终将调用 DragCompletedEventHandler(假设树中更深的另一个处理程序不会首先被调用并将 RoutedEventArgs.Handled 设置为 True,这将停止传播)。

你可以用这样的代码完成同样的事情:

ParentGrid.AddHandler(Thumb.DragCompletedEvent,new DragCompletedEventHandler(DragCompletedEventHandler));

其中 ParentGrid 是您想要收听的级别的父控件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...