使用集合属性进行序列化

时间:2011-11-16 18:00:33

标签: vb.net

好的,所以我写了一个托管多个触摸屏按钮的控件。此控件通过操作标记有属性的集合属性来完成此操作。现在它在设计者为表单创建的InitializeComponent()子系列中序列化这些按钮。但是,每当我删除主控件(承载按钮的控件)时,设计器都不会删除InitializeComponent()中按钮的序列化代码,但更糟糕的是。如果我从一个表单复制主控件并将其粘贴到另一个表单中,则不会复制这些按钮。

这是ButtonRow对象的代码:

Public Class ButtonRow
Inherits Control

Private WithEvents g_colTouchKeys As New TouchScreenButtonCollection
Private g_iMargin As Integer = 0

Public Sub New()
    MyBase.DoubleBuffered = True
End Sub

<DefaultValue(0I)> _
Public Property ButtonMargin() As Integer
    Get
        Return g_iMargin

    End Get
    Set(ByVal value As Integer)
        g_iMargin = value
    End Set
End Property

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _  Editor(GetType(ButtonCollectionEditor), GetType(UITypeEditor))> _
  Public ReadOnly Property Keys() As TouchScreenButtonCollection
    Get
        Return g_colTouchKeys
    End Get
End Property

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(e)

    If MyBase.DesignMode Then
        ArrangeButtons()
        RenderButtons(e.Graphics)
    Else
        SetupButtons()
    End If
End Sub

Private Sub ArrangeButtons()
    Dim icl As Integer = 0

    For Each B As TouchScreenKey In g_colTouchKeys
        B.Top = 0

        B.Left = icl
        icl += g_iMargin + B.Width
    Next
End Sub

Private Sub AddButtonToControlSurface()

    For Each B As TouchScreenKey In g_colTouchKeys
        If HasControl(B) = False Then MyBase.Controls.Add(B)
    Next

End Sub

Private Sub RemoveControlsNotInCollection()
    For Each C As Control In MyBase.Controls
        If TypeOf C Is TouchScreenKey Then
            If ButtonInCollection(DirectCast(C, TouchScreenKey)) = False Then
                MyBase.Controls.Remove(C)
            End If
        End If
    Next
End Sub

Private Function ButtonInCollection(ByVal B As TouchScreenKey) As Boolean
    For Each BT As TouchScreenKey In g_colTouchKeys
        If BT Is B Then Return True
    Next
    Return False
End Function

Private Function HasControl(ByVal C As Control) As Boolean

    For Each Ct As Control In MyBase.Controls
        If C Is Ct Then Return True
    Next

    Return False
End Function

Private Function CreateDefaultControl() As TouchScreenKey
    Dim t As New TouchScreenKey(0, "Default")

    t.Left = 0
    t.Top = 0
    t.Size = New Size(70, 70)

    Return t

End Function

Private Sub RenderButtons(ByVal g As Graphics)

    For Each B As TouchScreenKey In g_colTouchKeys
        Dim rect As Rectangle = New Rectangle(B.Left, B.Top, B.Width, B.Height)

        B.PaintButton(g, rect)

    Next
End Sub

Private Sub SetupButtons()
    ArrangeButtons()
    RemoveControlsNotInCollection()
    AddButtonToControlSurface()
End Sub

End Class

这是放置ButtonRow对象并在其集合中添加3个按钮后的InitilizeComponent()过程的示例:

Private Sub InitializeComponent()
    Me.ButtonRow1 = New TouchPadControls.ButtonRow
    Me.TouchScreenKey1 = New TouchPadControls.TouchScreenKey
    Me.TouchScreenKey2 = New TouchPadControls.TouchScreenKey
    Me.TouchScreenKey3 = New TouchPadControls.TouchScreenKey
    Me.SuspendLayout()
    '
    'ButtonRow1
    '
    Me.ButtonRow1.Keys.AddRange(New TouchPadControls.TouchScreenKey() {Me.TouchScreenKey1, Me.TouchScreenKey2, Me.TouchScreenKey3})
    Me.ButtonRow1.Location = New System.Drawing.Point(12, 12)
    Me.ButtonRow1.Name = "ButtonRow1"
    Me.ButtonRow1.Size = New System.Drawing.Size(321, 111)
    Me.ButtonRow1.TabIndex = 0
    Me.ButtonRow1.Text = "ButtonRow1"
    '
    'TouchScreenKey1
    '
    Me.TouchScreenKey1.ButtonPressGenerates = ""
    Me.TouchScreenKey1.Location = New System.Drawing.Point(0, 0)
    Me.TouchScreenKey1.Name = "TouchScreenKey1"
    Me.TouchScreenKey1.Size = New System.Drawing.Size(80, 80)
    Me.TouchScreenKey1.TabIndex = 0
    Me.TouchScreenKey1.Text = "TouchScreenKey1"
    '
    'TouchScreenKey2
    '
    Me.TouchScreenKey2.ButtonPressGenerates = ""
    Me.TouchScreenKey2.Location = New System.Drawing.Point(80, 0)
    Me.TouchScreenKey2.Name = "TouchScreenKey2"
    Me.TouchScreenKey2.Size = New System.Drawing.Size(80, 80)
    Me.TouchScreenKey2.TabIndex = 0
    Me.TouchScreenKey2.Text = "TouchScreenKey2"
    '
    'TouchScreenKey3
    '
    Me.TouchScreenKey3.ButtonPressGenerates = ""
    Me.TouchScreenKey3.Location = New System.Drawing.Point(160, 0)
    Me.TouchScreenKey3.Name = "TouchScreenKey3"
    Me.TouchScreenKey3.Size = New System.Drawing.Size(80, 80)
    Me.TouchScreenKey3.TabIndex = 0
    Me.TouchScreenKey3.Text = "TouchScreenKey3"
    '
    'Form1
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.ClientSize = New System.Drawing.Size(449, 305)
    Me.Controls.Add(Me.ButtonRow1)
    Me.Name = "Form1"
    Me.Text = "Form1"
    Me.ResumeLayout(False)

End Sub

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。我所要做的就是处理控件以删除它们,并使用ControlDesigner组件将子控件与主控件相关联。