无法设置属性值VB.NET

时间:2015-11-15 19:38:11

标签: vb.net winforms controls createparams

我正在为我的图书馆制作自定义表单

Public Class MycustomForm : Inherits Form

    Private Const CP_NOCLOSE_BUTTON As Integer = &H200
    Private _CloseBox As Boolean = True

    Public Sub New()
        MyBase.New()
    End Sub
    <Category("WindowStyle")> _
    <DefaultValue(True)> _
    <Description("This property enables or disables the close button")> _
    Public Property CloseBox As Boolean
        Get
            Return _CloseBox
        End Get
        Set(value As Boolean)
            If value <> _CloseBox Then
                value = _CloseBox
                Me.RecreateHandle()
            End If
        End Set
    End Property

    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Dim CustomParams As CreateParams = MyBase.CreateParams
            If Not _CloseBox Then
                CustomParams.ClassStyle = CustomParams.ClassStyle Or CP_NOCLOSE_BUTTON
            End If
            Return CustomParams
        End Get
    End Property

End Class

我创建了一个属性,为开发人员提供了禁用关闭按钮的可能性

当我在设计师中测试我的表单时,我更改了MyForm.Designer

Partial Class MyForm
    Inherits MycustomForm

之后,该属性已添加,当我尝试将属性更改为False时,我无法更改它,因为该属性未更改

我做错了什么?

2 个答案:

答案 0 :(得分:1)

请注意您的属性仅用于CreateParams属性getter。当窗口创建时,此getter仅在非常特定的时间使用。因此,如果您希望您的属性产生影响,则需要重新创建窗口。

这听起来很难,但不是。 Winforms通常需要动态地重新创建窗口,有几个现有属性具有相同的皱纹。像ShowInTaskbar,Opacity,FormBorderStyle等。让你的二传手看起来像这样:

    Set(value As Boolean)
        If value <> _CloseBox Then
            _CloseBox = value
            If Me.IsHandleCreated Then RecreateHandle()
        End If
    End Set

RecreateHandle()方法完成工作。它当然不可避免地闪烁了一点点。

答案 1 :(得分:0)

你犯了一个简单的错误。

value = _CloseBox更改为_CloseBox = value