C# 创建绘图对象

3
下面的代码是MSDN中的一个示例:
private void Form1_Paint(object sender, 
   System.Windows.Forms.PaintEventArgs pe) 
{
   // Declares the Graphics object and sets it to the Graphics object
   // supplied in the PaintEventArgs.
   Graphics g = pe.Graphics;
   // Insert code to paint the form here.
}

我有一些问题:
  • 我们能否更改Form1_Paint方法的名称?我的意思是它是否必须具有"Paint"后缀?.net何时调用此方法?框架如何知道调用哪个方法以便绘制图像?

  • 我不明白为什么我们只定义了Form1_Paint方法可以接收两个参数,然后框架会自动调用该方法,并传递一个对objectPaintEventArgs对象(pe)的引用。

非常抱歉问这样蠢的问题,但我的编程主要是函数式的,并且我对使用框架感到困惑,因为它们似乎在调用自己的方法。 有人能以6岁孩子的方式解释一下吗?


1
你需要研究事件、事件处理程序和委托。该方法是可重命名的。你将该方法附加为某种事件的事件处理程序,当事件被触发时,该方法会被触发,发送者是事件的触发器(我想),pe是与事件相关联的数据。 - D. Ben Knoble
这个问题以及Jon Skeet在第二个答案中的文章都有很好的信息。 - D. Ben Knoble
2个回答

3
根据注释,Form1_PaintPaint 事件的事件处理器。
这些参数并非魔法,而是该事件所必需的 - 即如果您想绑定到此事件,则处理程序方法实现必须与其所需的事件参数相匹配。 PaintEventHandler 被定义为:
public delegate void PaintEventHandler(object sender, PaintEventArgs e);

默认情况下,当您在设计器中添加处理程序时(例如通过双击UI控件或在“闪电闪烁”选项卡下单击Events图标),将自动创建一个带有默认名称的事件处理程序:

{name of the control}_{name of event}

在您的情况下,当处理程序方法被创建时,您的表单名称为Form1

您可以重命名处理程序方法,但是如果这样做,您还需要更改Form1.designer.cs中对应的事件绑定(即在下面更改this.Form1_Paint):

this.Name = "Form1";
this.Text = "Form1";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);

(+=表示订阅事件,一旦订阅,当事件被触发时,所有订阅的方法都将被调用)

编辑

由于您来自FP背景,您可能会对不需要显式命名的事件处理程序感兴趣,您还可以订阅适当类型的lambda:

this.Paint += (sender, pe) => 
{
   // Declares the Graphics object and sets it to the Graphics object
   // supplied in the PaintEventArgs.
   Graphics g = pe.Graphics;
   // Insert code to paint the form here.
};

在这里,senderpe的类型与之前完全相同。默认情况下,设计师不会这样做,因此您可以通过编写代码将上述订阅程序添加到您的Form1构造函数中。


换句话说,*designer.cs文件中包含控件的描述,例如它们的属性,附加的事件处理程序到特定方法等等。 - CuriousGuy
是的,designer.cs文件跟踪所有在设计时添加的控件及其设置。通常情况下,您不需要打开此类 - 它应该自动与您的可视化表单设计同步。(您也可以在运行时更改或覆盖控件,但此代码应放入您的Form.cs中) - StuartLC

2

Winforms是一种基于事件的技术,意味着事件发生时,程序员需要决定在该事件发生时要做什么(如果需要)。为了实现C#所使用的基于事件的编程模型,需要进行一些魔法的操作。

每当在Winforms项目中创建一个新窗体时,都会创建一个相关的.designer.cs文件以及您的.cs文件。 .designer.cs是一个自动生成的文件,它被Visual Studio用来生成设计窗体时所看到的视图。

当您向窗体添加控件时,该控件在.designer.cs文件中通过编程方式创建并赋予一些默认值(例如大小、名称和ID)。然后,该文件被Visual Studio设计器解析,并根据该.designer.cs文件呈现设计视图。您可以打开.designer.cs文件,查看在其中通过编程方式创建的所有控件。

现在,控件的物理属性不是唯一在.designer.cs文件中通过编程方式创建的东西。还创建了事件。当您创建新事件(例如Paint事件)时,Visual Studio会进入.designer.cs文件,并将事件处理程序附加到该控件的事件上。然后,它在您的.cs文件中创建一个方法存根,并将该方法存根附加到.designer.cs文件中的事件上。您可以自由更改名称,只要不更改方法的参数即可。在.CS文件中的方法名称必须与.designer.cs文件中的名称相匹配,因此您需要在两个位置更改名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接