强制 Visual Studio 在设计器中添加方法调用,就像使用 SuspendLayout 和 ResumeLayout 一样

kec*_*eco 1 c# vb.net visual-studio

我创建了一个UserControl没有控件的项目。我这一切都是通过绘画操作完成的。因此控件有很多属性和自定义布局方法来计算这些绘制的“控件”的位置和大小。当影响布局的属性发生更改时,将调用布局方法。

UserControl当初始化带有 my 的表单时,这会导致过度调用 my 布局方法。在我的文章中UserControl,我通过使用标志阻止了布局方法的所有不必要的调用。但我无法控制添加我的表单的设计者UserControl

有没有办法告诉 Visual Studio 在设计器中设置所有属性之前和之后添加自定义方法,就像使用SuspendLayout和 一样ResumeLayout?或者是否有完全不同的设计方法UserControls

jmc*_*ney 5

如果我理解你的意思,你应该做的是实现ISupportInitialize接口并将代码放入BeginInitEndInit方法中。尝试将 a 添加DataGridView到表单,然后检查设计器代码以查看对这些方法的调用是否自动添加到该InitializeComponent方法中。

请注意,在设计器代码中,控件被强制转换为接口类型以进行该调用。这是因为约定是使实现显式化,这意味着在 VB 中声明方法Private,例如

Imports System.ComponentModel

Public Class InitialisedControl
    Implements ISupportInitialize

    Private Sub BeginInit() Implements ISupportInitialize.BeginInit
        '...
    End Sub

    Private Sub EndInit() Implements ISupportInitialize.EndInit
        '...
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果不强制转换为接口类型,则无法访问成员。这是我的设计器代码文件添加了该控件的实例后的样子:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.InitialisedControl1 = New WindowsApp1.InitialisedControl()
        CType(Me.InitialisedControl1, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'InitialisedControl1
        '
        Me.InitialisedControl1.Location = New System.Drawing.Point(12, 12)
        Me.InitialisedControl1.Name = "InitialisedControl1"
        Me.InitialisedControl1.Size = New System.Drawing.Size(150, 150)
        Me.InitialisedControl1.TabIndex = 2
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(800, 450)
        Me.Controls.Add(Me.InitialisedControl1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        CType(Me.InitialisedControl1, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents InitialisedControl1 As InitialisedControl
End Class
Run Code Online (Sandbox Code Playgroud)