1

我需要一个从父控件到子控件的隧道路由事件隧道的简单示例。

(这不是真正的代码)——事实上,我越深入,我就越认为 XAML 是错误的——可能不应该在子节点上注册 XAML 中的隧道事件(不确定?)

<PARENT>    
   <MyControl DoSomethingOnUserAction="raiseTunnelEvent"> HELP </MyControl >    
   <CHILD> I SHOULD HANDLE tunnelled event </CHILD> 
</PARENT>

简单、简洁的例子会很有帮助。

谢谢,艾伦

4

2 回答 2

3

不确定,但你可能想让猫叫。

Button 的 RoutedEvent ClickEvent(来自 PresentationFramework)声明为:

public static readonly RoutedEvent ClickEvent = 
    EventManager.RegisterRoutedEvent("Click", 
    RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof
    (ButtonBase));

注意readonly RoutingStrategyBubble

以下内容可能有助于理解 Tunnel、Bubble 和 Direct:msdn.microsoft.com/en-us/library/system.windows.routingstrategy.aspx

这应该会带你走完剩下的路:msdn.microsoft.com/en-us/magazine/cc785480.aspx

提示:按照惯例,WPF 中的隧道事件以“Preview”开头(例如-“PreviewExplode”。如果事件不以“Preview”开头,则可能不使用隧道 RoutingStrategy。此外,您通常会看到一个 Tunnel 和气泡首先与隧道配对,然后是气泡,如“PreviewExplode”,然后是“Explode”。

如果你需要一个 Button 的 Click 隧道,你可以考虑

  1. 使用 PreviewMouseDown (当然不一样,可能很危险,因为并非所有的鼠标按下都意味着点击)。
  2. 编写一个引发 PreviewClick 和 Click 的 TunnelButton。
于 2009-08-20T19:43:30.653 回答
2

原来我有 WPF In Action with Visual Studio 2008 的书,第 149 页,有一个非常误导性的图表,似乎表明 RoutedEvents 可以在父节点中引发,并且路由事件通过隧道传送到子节点。

事实证明并非如此......坏图的 1/2 天吹 b/c(否则相当好书)[ ISBN : 1-933988-22-3 ]

于 2009-08-20T20:46:03.287 回答