我不知道,你到底想知道什么。事情很简单:您可以在实例(对象)级别或类级别注册处理程序。
不同之处在于,当您在类级别注册事件时,它将在任何实例级别处理程序之前首先被调用(当然,如果处理类在逻辑树中较低/较高,则隧道或冒泡仍然发生之前)。因此,您可以在类级别处理此事件并过滤此事件是否应由实例处理(通过设置e.Handled = true
您将停止事件以通过其他处理程序)。在某些情况下它可能很有用,但现在我还没有想分享的例子。
此示例将注册事件处理程序,该处理程序仅在为特定元素实例引发事件时调用:
DockPanel panel = new DockPanel();
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));
这将创建事件处理程序,每次将调用任何DockPanel
将获得 Button.Click 事件,在此实例处理程序DockPanel
将被调用之前:
EventManager.RegisterClassHandler(typeof(DockPanel),
Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click));
如果方法是:
private void ButtonClass_Click(object sender, RoutedEventArgs e)
{
Debug.Write("Class level handler");
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Debug.Write("Instance level handler");
}
这将创建输出:
类级处理程序
实例级处理程序
但是,如果在类级别处理程序中您将事件参数设置为handeled ( e.Handled = true;
),它将过滤掉此事件以用于实例级别处理程序(并在逻辑树中冒泡)。