Значение свойства базового класса не сохранено дизайнером

Я добавил форму в свой проект WinForms в Visual Studio Express 2013, которую я хочу использовать в качестве базовой формы для других форм. Скажем, я поместил кнопку в этой форме и хочу иметь свойство, которое делает эту кнопку видимой или невидимой.

Imports System.ComponentModel
Public Class MyForm
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    Public Property ButtonVisible As Boolean
        Get
            Return Button1.Visible
        End Get
        Set(value As Boolean)
            Button1.Visible = value
        End Set
    End Property
End Class

Конструктор этого файла не был изменен. Я просто добавил кнопку в новую форму.

Когда я сейчас создаю новую форму, которая наследует этот класс, я могу изменить значение этого свойства, и во время разработки кнопка действительно становится видимой или невидимой. Однако когда я компилирую проект, свойство сбрасывается обратно к значению по умолчанию. Когда я проверяю файл конструктора производной формы, я вижу, что измененное значение свойства не добавляется к нему и поэтому исчезает в воздухе. Когда я добавлю ButtonVisible = False вручную в файл конструктора он работает и остается там, так что, я думаю, проблема заключается в том, что конструктор не добавляет строку в файл конструктора.

Это файл конструктора производной формы после того, как я изменил значение свойства в конструкторе:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form2
    Inherits MyForm

    'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    <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

    'Wird vom Windows Form-Designer benötigt.
    Private components As System.ComponentModel.IContainer

    'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    'Das Bearbeiten ist mit dem Windows Form-Designer möglich.  
    'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.SuspendLayout()
        '
        'Form2
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(284, 261)
        Me.Name = "Form2"
        Me.Text = "Form2"
        Me.ResumeLayout(False)

    End Sub
End Class

Как видно из приведенного выше кода, я уже пытался решить эту проблему, проверяя различные значения для DesignerSerializationVisible, но они, кажется, не имеют никакого эффекта.

Есть что-то, что я упустил? Как мне добавить свойства, которые изменяют элементы управления в базовом базовом классе?
Ответы на C# или VB.NET очень ценятся, что бы вы ни хотели.

1 ответ

Решение

Во-первых, кажется, вы неправильно поняли DesignerSerializationVisibility.Content ценность DesignerSerializationVisibility приписывать.

Вам нужно использовать DesignerSerializationVisibility.Visible значение, чтобы сохранить значение свойства. Смотрите этот шаг: свойства не будут сериализованы в файл.designer.cs

Тогда вы не можете обратиться непосредственно к Button.Visible собственность в вашей таможенной собственности. Состояние видимости кнопки будет сброшено до значения по умолчанию (True) каждый раз открываешь унаследованное form, Так что ваше пользовательское свойство всегда будет отображаться True когда форма будет загружена.

Вам нужно

  • сохранить состояние в переменной
  • настроить видимость кнопки после InitializeComponent метод и когда значение вашей собственности меняется.

Public Class MyForm

    Public Sub New()
        InitializeComponent()
         Me.Button1.Visible = _buttonVisibility
    End Sub

    Private _buttonVisibility As Boolean = True

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)>
    Public Property ButtonVisible As Boolean
        Get
            Return _buttonVisibility
        End Get
        Set(value As Boolean)
            _buttonVisibility = value
            Button1.Visible = value
        End Set
    End Property

End Class
Другие вопросы по тегам