在没有 child 控件实例的情况下订阅任何 bubbled-up WPF child 控件路由事件

Subscribe to any bubbled-up WPF child control routed event without an instance of a child control

我有一个 WPF 自定义控件,其中包含 canvas,显示多个 child object 和(可能)ItemsControl。我不知道会有多少 child object 或它们会有多少嵌套。

但我需要此控件来捕获来自任何 child Thumb 的任何“bubbled-up”Thumb.DragCompleted 事件。问题是,它没有要订阅的 Thumb 控件的任何特定实例。它只需要无论如何捕获事件并在拇指满足特定条件时采取特定操作。

是否可以在 code-behind 中订阅所有此类 child 事件?我能看到的最接近的似乎是 EventManager.RegisterClassHandler,但我不希望应用程序中的每个拇指都有一个 DragCompleted,只是我的 child object 的那些。我一定是遗漏了一些明显的功能,是吗?

我找到的示例似乎期望您实际上有一个 Thumb 控件 object 实例。

您可以在 XAML 中订阅冒泡型路由事件,如下所示:

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

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

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

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

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