我最近才发现ISupportInitialize这个接口。在开发复杂一点的winform控件的时候它实在是很有用。
MSDN上有对ISupportInitialize的介绍,我这里只说一下在什么情况下用它发挥作用。
问题
我要做一个比较复杂的控件“OpenGLControl”,它能够在winform程序中执行opengl命令,渲染出3D场景。这个控件有一些相关的属性,在设计器里,这些属性是这样写(自动生成)的:
// // openGLControl1 // this.openGLControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.openGLControl1.BitDepth = 32; this.openGLControl1.DrawRenderTime = true; this.openGLControl1.FrameRate = 29.41176F; this.openGLControl1.Location = new System.Drawing.Point(12, 12); this.openGLControl1.Name = "openGLControl1"; this.openGLControl1.RenderContextType = SharpGL.RenderContextType.NativeWindow; this.openGLControl1.Size = new System.Drawing.Size(768, 379); this.openGLControl1.TabIndex = 0; this.openGLControl1.OpenGLDraw += new System.Windows.Forms.PaintEventHandler(this.openGLControl1_OpenGLDraw);
于是问题来了。
BitDepth,OpenGLDraw,FrameRate等等必须在Size这个属性之前设置好。这我们怎么控制?这种自动生成的代码天晓得我们怎么去管它。
于是ISupportInitialize接口出场了。如果OpenGLControl实现了这个接口,那么在设计器里自动生成的代码就会是这样的:
private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormExample1)); this.label1 = new System.Windows.Forms.Label(); this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.openGLControl1 = new SharpGL.OpenGLControl(); ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).BeginInit(); this.SuspendLayout(); // // ...ordianry designer code... // ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); }
好了。想让Size属性最后设置是吧,好说啊,在EndInit方法里设置它就好了。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, this
, 属性
, forms
, system
, 自动生成
, opengl sharpgl
, 引用控件失效c#sharpgl
SharpGL
isupportinitialize、接口的用处、hdmi接口用处、车棉衣的用处、阿里云对普通人的用处,以便于您获取更多的相关知识。