调用.NET WinForms事件处理程序的时间

时间:2013-07-09 17:52:30

标签: .net winforms

用户是否可以在WinForms中执行某些操作(例如,单击按钮)并在UI线程上执行一些任意代码在UI上执行该操作的事件处理程序线? (编辑:我不想自己这样做。我想知道它是否真的会发生。就像在,我需要担心吗?)

对于如何在.NET中为GUI事件调用事件处理程序,我有点模糊,而且我遇到了实现细节很重要的情况。

** ***编辑
我不关心如何连接事件处理程序,甚至不关心如何以编程方式引发事件。我关注的是有关如何通过UI操作调用我已经连接的事件处理程序的详细信息。更具体地说,我很好奇是否只是将事件处理程序(或导致它的事件序列)的调用添加到表单的消息循环中。可以更容易地“直观地”显示UI线程...

时间--------->
物理点击检测.......(其他东西可以在这里点击UI线程)............点击事件处理程序调用

2 个答案:

答案 0 :(得分:4)

有两种方法可以做到这一点。

Windows窗体中的大多数控件都提供了用于引发事件的方法。如果您对控件进行了子类化,则可以在引发事件之前将自定义代码放在方法中。

例如,您可以继承Button,并覆盖OnClick

override void OnClick(EventArgs e)
{
    // Your code here...
    base.OnClick(e); // This will raise the Click event
}

另一种选择是订阅事件 first ,并将您的代码放在事件处理程序中。默认情况下,事件处理程序将按顺序调用每个委托。


  

我关注的是有关如何通过UI操作调用我已经连接的事件处理程序的详细信息。更具体地说,我很好奇是否只是将事件处理程序(或导致它的事件序列)的调用添加到表单的消息循环中。

当用户单击按钮时,鼠标事件将发布到应用程序的消息循环中。 Button在WndProc覆盖中处理此消息(通过处理定义为WM_REFLECT + WM_COMMAND的消息)。

如果你的问题是“可以在用户点击的瞬间和事件处理程序之间运行其他代码”,那么是 - 当用户点击时代码可以运行,并且代码将继续运行,直到消息泵可以处理消息。

答案 1 :(得分:0)

您最好的选择可能是将您的按钮子类化,然后将您的代码添加到覆盖OnClick方法(在调用基础OnClick之前)。该代码将在任何附加事件处理程序之前执行(单击)。