【问题标题】:Event handled 2 levels up事件处理 2 级
【发布时间】:2012-03-02 10:27:11
【问题描述】:

在 WPF 应用程序 (C#) 中,我在类 ClassA 中有一个 ObjectX 实例。此 ClassAClassB 中实例化。

因此 ClassB -> 包含的实例 -> ClassA -> 包含的实例 -> ObjectX

ObjectX 引发 EventA。我需要在 ClassB 中处理这个事件。

这个概念叫什么(事件委托,事件路由,...)?又是怎么做到的?

【问题讨论】:

  • 你的类是框架元素(控件)吗?
  • ObjectX 是 FacebookClient 实例,ClassA 是自定义 Adapter 类,ClassB 是 WPF 窗口。

标签: c# wpf oop events c#-4.0


【解决方案1】:

在 WPF 中,它被称为 Routed events,但这只有在这两个都为真时才有效:

  1. 我们谈论的是元素类,“包含”意味着您的一个控件实际上包含另一个 [并且LogicalTreeHelper 声明您的控件是彼此的父/子。
  2. 如果您要查找的事件被定义为使用正确的路由策略进行路由 - tunelledbubbling 将起作用。如果不是,那么路由事件将无济于事。

我觉得你所需要的只是这样的:

B 类:

this.instanceOfA.InstanceOfX.MyEvent += MyHandlerInClassB;

但这与 WPF 无关。


UPD:或类似的东西,如果你不想让 instanceOfX 可访问:

  1. classA 上定义相同的事件,并在 instanceOfX 引发其事件时引发它
  2. ClassB 处理instanceOfA.MyEvent

在这种情况下,您可以将 instanceOfX 设为私有,但您必须在中间添加一个事件。

【讨论】:

  • this.instanceOfA.InstanceOfX.MyEvent += MyHandlerInClassB;
  • @Link- 已更新,不幸的是,如果原始事件不是正确的 RoutedEvent 的实例,则无法让它变得非常好。如果不是你能做的就是以旧方式处理事件,或多或少地公开对象
【解决方案2】:

WPF 有路由事件:

在元素树中的多个侦听器上调用处理程序,而不是 就在引发事件的对象上。

http://msdn.microsoft.com/en-us/library/ms742806.aspx

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2021-12-14
    • 2011-07-10
    • 2020-06-02
    相关资源
    最近更新 更多