UIElement.AddHandler() 与 .Event += 定义

UIElement.AddHandler() vs .Event += Definition(UIElement.AddHandler() 与 .Event += 定义)
本文介绍了UIElement.AddHandler() 与 .Event += 定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题的第一部分:这两个事件注册有什么区别?

1.st part of the quesion: What is the difference between these 2 event registrations ?

_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));

_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);

问题的第二部分:或最终与

popUp.Opened += PopUp_Opened;

推荐答案

根据Redgate的Reflector,没有区别.这两种方法最终都会调用内部方法EventHandlerStore.AddRoutedEventHandler.这是 PreviewMouseLeftButtonDown 事件的 add 访问器的反射器输出(在类 UIElement 中):

According to Redgate's Reflector, there is no difference. Both methods eventually call the internal method EventHandlerStore.AddRoutedEventHandler. This is the reflector output of the add accessor for the PreviewMouseLeftButtonDown event (in the class UIElement):

public void add_PreviewMouseLeftButtonDown(MouseButtonEventHandler value)
{
    this.AddHandler(PreviewMouseLeftButtonDownEvent, value, false);
}

如您所见,它会为您调用 UIElement.AddHandler.

As you can see it calls UIElement.AddHandler for you.

在编辑问题之前,您询问的是弹出窗口的 Opened 事件.在这种情况下,有一个区别:首先,Opened事件不是作为路由事件实现的,而是作为一个简单事件实现的,所以你甚至不能使用AddHandler打电话给它.其次,反射器显示在 EventHandlerStore 中调用了一个不同的方法,它将处理程序添加到一个简单的委托集合中.

Before you edited your question you were asking about the Opened event of the popup. In that case, there is a difference: First, the Opened event is not implemented as a routed event but as a simple event, so you can't even use the AddHandler call on it. Secondly, the reflector shows that a different method is called in the EventHandlerStore which adds the handler to a simple delegate collection.

这篇关于UIElement.AddHandler() 与 .Event += 定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)