我注意到在C#中我可以覆盖Form()父类中的方法,如下所示:
protected override void OnPaint(PaintEventArgs e)
{
}
我不明白如何生成PaintEventArgs
以及如何/何时将其传递给此函数。我必须假设每次表格需要重新绘制时都会调用OnPaint()
。
此外,当我创建按钮按下事件时,它们看起来像这样:
private void button1_Click(object sender, EventArgs e)
{
}
再一次,我不明白激活按钮点击时这些参数是如何/为什么传递的。
答案 0 :(得分:12)
没有什么特别之处。定义Paint
事件的基类包含与此类似的代码:
protected virtual void OnPaint(PaintEventArgs e)
{
var paintHandlers = this.Paint;
if (paintHandlers != null)
{
paintHandlers(this, e);
}
}
OnPaint
有两个功能:
Paint
事件,以便通知外部订阅者(这是假设的form1_Paint
最终会被调用的方式)。当提升Paint
事件时,基类中的其他一些代码会根据手头的信息创建一个PaintEventArgs
实例并调用OnPaint
:
// ...somewhere in the class...
OnPaint(new PaintEventArgs(...));
在将事件参数键入为EventArgs
的特殊情况下,无需创建新实例,您可以直接将EventArgs.Empty
静态成员传递给OnSomething
方法。
对于当发生这种情况时:每当从应用程序的message pump中提取消息并进行处理时,都会指示应该引发该事件。您可能还想阅读Understanding events and event handlers in C#。
答案 1 :(得分:1)
最好的起点是(重新)熟悉.Net“代表”:
例如,如果您查看C#表单的代码,您可能会看到如下内容:
private void btnGo_Click(object sender, EventArgs e)
{
// My code goes here...
现在,如果您查看相应的自动生成的.Design代码,您会看到以下内容:
private void InitializeComponent()
{
this.btnGo.Click += new System.EventHandler(this.btnGo_Click);
....
“+ =”语法将自定义事件处理程序分配给按钮。任何关于“代表”的教程(包括我上面引用的链接)都会为您提供有关其工作方式和原因的更多详细信息。
我希望有帮助.. PSM
答案 2 :(得分:1)
对于按钮单击事件处理程序,object sender, EventArgs e
语法允许将多个按钮连接到单个事件处理程序。这是可能的,因为sender
是启动事件的对象,因此您可以区分button1,button2或button3是否启动了事件。
由于sender
是一个object
,所以你可以设想一个单击处理程序来处理所有可点击的页面元素,并在处理程序中有一堆条件逻辑来切换什么类型的控制发起了事件;不建议这样做。