在没有 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
是您要收听级别的父控件。
我有一个 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
是您要收听级别的父控件。