【问题标题】:Force Visual Studio to add method calls in the designer like it does with SuspendLayout and ResumeLayout强制 Visual Studio 在设计器中添加方法调用,就像使用 SuspendLayout 和 ResumeLayout 一样
【发布时间】:2020-07-01 15:00:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# vb.net visual-studio


    【解决方案1】:

    如果我理解您的意思,您应该做的是实现ISupportInitialize 接口并将您的代码放入BeginInitEndInit 方法中。尝试将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
    

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

    <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
    

    【讨论】:

    • 这正是我想要的。我想我会将这两种方法公开,以便能够随时更改多个属性,而无需不断更新/布局/重绘。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2011-05-12
    • 2018-07-11
    • 2012-03-24
    • 1970-01-01
    • 2012-08-16
    • 2012-01-08
    相关资源
    最近更新 更多