3

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

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

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

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

4

2 回答 2

4

有两种选择可以实现这一点。

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

例如,您可以子类化Button并覆盖OnClick

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

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


我关心的是我已经连接的事件处理程序如何作为 UI 操作的结果被调用的幕后细节。更具体地说,我很好奇事件处理程序的调用(或导致它的事件序列)是否简单地添加到表单的消息循环中。

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

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

于 2013-07-09T17:59:29.990 回答
0

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

于 2013-07-09T17:57:39.787 回答