【问题标题】:Where is InvokeOnClick() method called when I click a button in C# WinForms?当我单击 C# WinForms 中的按钮时,在哪里调用 InvokeOnClick() 方法?
【发布时间】:2018-10-31 14:05:44
【问题描述】:

我发现InvokeOnClick 是在单击按钮时引发Click 事件的方法。
但我找不到在设计器代码中调用InvokeOnClick() 方法的代码。
我是不是搞错了概念?
如果是,那么当我们点击按钮控件时,Click事件实际上是如何被调用的?

public class Control
{
    public event EventHandler Click{
                        add
                        {
                            this.Events.AddHandler(Control.EventClick, (Delegate) value);
                        }
                        remove
                        {
                            this.Events.RemoveHandler(Control.EventClick, (Delegate) value);
                        }
    }

    protected void InvokeOnClick(Control toInvoke, EventArgs e)
    {
        toInvoke?.OnClick(e);
    }
}

【问题讨论】:

  • 你为什么要问? Windows 窗体基础结构负责处理这一点。一般来说,您需要做的就是连接事件处理程序并从这些处理程序调用您的代码。如果你真的想知道发生了什么,把一个简单的 WinForms 应用程序放在一起,在上面放一个按钮,编写一个 Click 事件处理程序,在其中放置一个断点,单击,然后查看堆栈。右键单击堆栈窗口并选择“显示外部代码”。您将看到所有使您的点击处理程序被调用的 Windows 窗体 goop
  • @Flydog57 我目前正在研究代表和活动。我想知道.NET 是如何处理这些事件的。感谢您的提示。

标签: c# winforms events


【解决方案1】:

InvokeOnClick 当前未使用。

Click 事件由Control.OnClick 方法引发:

EventHandler handler = (EventHandler)Events[EventClick];
if (handler != null) handler(this, e);

对于Button,会发生这种情况,例如鼠标向上并调用PerformClick: see here。

【讨论】:

  • 感谢您的参考。不知道有一个网站显示源代码。
  • @Aoi:在 Visual Studio 中,选择 Tools->Options,然后选择 Debugging->Enable Source Server support。我在这里不能这样做(安全性),但是有一种方法可以让您从堆栈窗口中看到该源(我认为 - 我已经很久没有看过了)
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
相关资源
最近更新 更多