WPF事件系统如何了解事件路由?

时间:2012-05-21 11:27:01

标签: wpf routed-events raise

我想了解RoutedEvents的工作原理。 好吧 - 我浏览了一些教程并理解了为什么RoutedEvents有用以及它们如何工作。 但有一点,我没有得到:

假设我写了一个类(例如“MyClass”),它有一个RoutedEvent属性,sth。像这样:

public class MyClass 
{
public static readonly RoutedEvent myEvent;
...
}

好吧 - 只提供一个属性是不够的 - 所以我必须在EventManager的帮助下注册RoutedEvent:

...
myEvent = EventManager.RegisterRoutedEvent("MyEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyClass));
...

好的 - 现在WPF事件系统知道这个事件。 如果我这样做,我写的每个类都将拥有自己的RoutedEvent。但这对我来说毫无意义。

我想要的是,其他类是否听取同一事件 - 而不是MyClass的类型。

例如: 我有一个stackpanel,在stackpanel内是一个按钮。单击stackpanel将引发onClick事件。单击该按钮将引发按钮的onClick事件 - 然后是stackpanel上的onClick事件。 但是如何?

抱歉 - 我很难描述这个问题 - 我太困惑了。)

很多。 CodeCannibal

1 个答案:

答案 0 :(得分:1)

我想要的是,其他类是否听取同一事件 - 而不是MyClass的类型。

您期望从中获得权利,这就是它所提供的。我的意思是通过注册RoutedEvent,你没有强烈地将它绑定到类型;相反,你使用字符串“MyEvent”桥接它 EventManager.RegisterRoutedEvent(“MyEvent”,...

RoutedEvent遍历逻辑树并在处理时停止遍历(例外)。

因此,StackPanel不需要从MyClass派生。您只需要通过指定action / handler在StackPanel上注册RoutedEvent。每当RoutedEvent遍历StackPanel时,它都会调用相应的操作。

例如:

UserControl1.cs

//Routed Event
public static readonly RoutedEvent ThisIsEvent = EventManager.RegisterRoutedEvent("ThisIs", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(UserControl1));

// .NET wrapper
public event RoutedEventHandler ThisIs
{
    add { AddHandler(ThisIsEvent, value); }
    remove { RemoveHandler(ThisIsEvent, value); }
}

//local handler where RaiseEvent is called
private void button1_Click(object sender, RoutedEventArgs e)
{
    RaiseEvent(new RoutedEventArgs(ThisIsEvent));
}

以下是您在XAML中订阅该活动的方式。您也可以在代码文件中执行此操作...

<StackPanel Orientation="Vertical" **local:UserControl1.ThisIs="StackPanel_ThisIs"** >
    <local:UserControl1></local:UserControl1>
</StackPanel>

我希望这清楚你的怀疑。