2013-07-09 30 views
3

用户是否可以在WinForms中执行某些操作(例如,单击按钮)并在执行该动作的事件处理程序之前在UI线程之前执行了一些任意代码在UI线程? (编辑:我不想自己这样做,我想知道它是否可以实际发生,因为在中,我需要担心它吗?)调用.NET WinForms事件处理程序的时机

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

**编辑***
我不关心如何连接事件处理程序,甚至如何以编程方式引发事件。我关心的是如何将我已经连接的事件处理程序作为UI操作的结果调用的底层细节。更具体地说,我很好奇,如果事件处理函数的调用(或者导致它的事件序列)被简单地添加到表单的消息循环中。它可能更容易显示UI线程“视觉上”...

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

+0

你想做什么?如果这是你自己的代码,只要把它放在事件处理程序之前的其他逻辑... –

+2

定义任意:) –

+0

有几种可能的技巧,并不是每种技巧都适用于每种情况。你具体是非常重要的。 –

回答

4

有两种选择来实现这一点。

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

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

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

另一种选择是订阅事件第一,并把你的代码的事件处理程序。事件处理程序默认会按顺序调用每个委托。


我关心的,我已经迷上了事件处理程序被怎么叫的UI操作的结果下,发动机罩的细节。更具体地说,我很好奇,如果事件处理函数的调用(或者导致它的事件序列)被简单地添加到表单的消息循环中。

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

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

+0

甚至没有接近我所问的。请参阅更新的问题。谢谢,不过。 – aaronburro

+1

@aaronburro我添加了一个编辑,我〜相信〜回答你的问题 - 这并不完全清楚你在这里之后... –

+0

你的编辑是有用的,几乎回答我的问题... “可以运行其他代码...“应该更改为”可以在UI线程*之间运行其他代码*“ – aaronburro

0

您最好的选择可能是继承您的按钮,然后将您的代码添加到重写OnClick方法(在调用基地OnClick之前)。该代码将在任何附加的事件处理程序(用于单击)之前执行。