基类的属性值未由设计器保存

本文关键字:保存 属性 基类 | 更新日期: 2023-09-27 18:26:14

我在Visual Studio Express 2013中向WinForms项目添加了一个表单,我想将其用作其他表单的基本表单。假设我在此窗体上放置了一个按钮,并且我想要一个使该按钮可见或不可见的属性。

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,我们都非常感谢。

基类的属性值未由设计器保存

首先,您似乎误解了DesignerSerializationVisibility属性的DesignerSerializationVisibility.Content值。

您需要使用DesignerSerializationVisibility.Visible值来保存属性的。请参阅此相关踏板:Properties won';t被序列化到.designer.cs文件中

然后您不能在自定义属性中直接引用Button.Visible属性。每次打开继承的form时,按钮的可见性状态将重置为默认值(True)。因此,在加载表单时,您的自定义属性将始终显示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