【问题标题】:WPF How to create CUSTOM tunel routedevent?WPF 如何创建自定义 Tunel routedevent?
【发布时间】:2017-03-10 04:13:44
【问题描述】:

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

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

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

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

谢谢, 艾伦

【问题讨论】:

    标签: wpf routedevent


    【解决方案1】:

    不确定,但您可能希望猫叫。

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

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

    注意Bubblereadonly RoutingStrategy

    以下内容可能有助于理解 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。您通常还会看到隧道和气泡先与隧道配对,然后是气泡,如“PreviewExplode”和“Explode”。

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

    1. 使用 PreviewMouseDown(当然不一样,而且可能很危险,因为并非所有的鼠标按下都意味着点击)。
    2. 编写一个引发 PreviewClick 然后引发 Click 的 TunnelButton。

    【讨论】:

    • 我认为我错误地认为 RoutingStrategy.Tunnel 可以将事件传递给源节点的子节点(例如,父控件可以引发将“隧道”传递给子节点的事件)。重新阅读您放在这里的文档后,所有路由事件似乎都在源节点开始(冒泡)或结束(隧道)或两者(直接)。因此,在这种情况下,我的示例无法使用 WPF RoutedEvents。一只吠叫的猫……
    • 我在示例中使用 BUTTON 也无济于事(这只是分散了实际问题的注意力)——是的,我看过 PreviewMouseDown 示例……我希望 PARENT (事件发生的地方)--[隧道]-->ToChild
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多