[英]C# create drawing object
以下代码是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
方法可以接收2个参数然后神奇地框架只是通过对object
的引用和对PaintEventArgs
对象(pe)的引用来调用该方法。
我很抱歉这些愚蠢的问题,但我主要来自函数式编程,我对使用框架很困惑,因为看起来他们正在调用自己的方法。 有人可以像6岁那样解释一下吗?
根据注释, Form1_Paint
是Paint
事件的事件处理程序。
参数不是魔术,它们是此事件所必需的 - 即如果要绑定到此事件,则处理程序方法实现必须匹配它所需的事件参数。 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.
};
sender
和pe
的类型与以前完全相同。 默认情况下,设计器不会执行此操作,因此您可以通过编程方式将上述订阅添加到Form1
构造函数中
Winforms是一种基于事件的技术,意味着事件发生,以及程序员在事件发生时决定做什么(如果有的话)的工作。 为了实现C#使用的基于事件的编程模型,会发生一些小小的魔力。
每当在Winforms项目中创建新表单时,都会创建一个关联的.designer.cs
文件以及.cs
文件。 .designer.cs
是一个自动生成的文件。 Visual Studio使用它来生成设计表单时看到的设计器视图。
向表单添加控件时,该控件将在.designer.cs
文件中以编程方式创建,并给出一些默认值(例如大小,名称和ID)。 然后由Visual Studio设计器解析该文件,设计器根据该.designer.cs
文件呈现设计器视图。 您可以打开.designer.cs
文件,并查看以编程方式创建的表单上的所有控件。
现在,控件的物理属性不是在.designer.cs
文件中以编程方式创建的.designer.cs
内容。 事件也被创建。 当您创建一个新事件(例如Paint
事件)时,Visual Studio将进入.designer.cs
文件并将事件处理程序附加到该控件的事件。 然后,它会在.cs
文件中创建一个方法存根,并将该方法存根附加到.designer.cs
文件中的事件中。 只要不更改方法的参数,您就可以自由地将名称更改为您想要的任何名称。 你在你的方法的名称.CS
文件必须在你的名称相匹配.designer.cs
文件,所以您需要在两个地方改名字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.