代码之家  ›  专栏  ›  技术社区  ›  Stewbob

标签控件在设计时与运行时的行为不同

  •  6
  • Stewbob  · 技术社区  · 15 年前

    我正在创建一个自定义标签控件(只需继承标准标签控件并重新绘制背景和文本),因为我需要一个非常具体的背景和边框。在控件的构造函数中,我将AutoSize属性设置为false,以便为新标签设置标准的默认大小。

     Public Sub New()
    
        'Set the default size of the control to 75x24
        Me.Height = 24
        Me.Width = 75
    
        'Turn off the autosize property.
        Me.AutoSize = False
    
        'Turn on double-buffering.
        Me.DoubleBuffered = True
    
     End Sub
    

    在使用此控件的应用程序中,如果在运行时(在代码中)创建新的自定义标签,AutoSize属性将保持为false,并且工作正常。

    如果我试图在设计时将新的自定义标签添加到表单中,它将自动调整大小属性设置为true,并且我必须在“属性”窗口中手动将其设置为false。这不是一个大问题,但我不明白为什么行为不同。

    有什么想法是什么导致了这种行为上的差异?

    4 回复  |  直到 12 年前
        1
  •  6
  •   NascarEd    15 年前

    在Label类中,应重写AutoSize属性。

    //(In C#)
    [System.ComponentModel.Browsable(false)]
    [System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)]
    public new bool AutoSize
    {
       get { return base.AutoSize; }
       set { base.AutoSize = value; }
    }
    

    可浏览(false)将在设计时隐藏属性,designerSerializationVisibility属性将告诉设计器不要在设计器文件中写入任何代码。

        2
  •  3
  •   Stewbob    12 年前

    我终于用VB实现了。我必须禁用set语句,本质上是将重写的AutoSize属性转换为只读属性。

         Public Overrides Property AutoSize() As Boolean
            Get
               Return MyBase.AutoSize
            End Get
            Set(ByVal value As Boolean)
               'Do nothing here
            End Set
         End Property
    

    感谢Nascare让我找到了正确的方向。

        3
  •  2
  •   Jules    15 年前

    仅为将来提供信息,要在“属性”窗口中将“自动调整大小”属性设置为“假”,需要设置一个属性:

    <system.componentModel.defaultValue(false)>。_

    public将属性autoSize()重写为布尔值….

        4
  •  0
  •   Kurisu    15 年前

    如果进入正在创建的新控件的设计模式,则应能够选择该控件并根据需要更改属性。从那时起,每当您将该控件添加到窗体(或其他控件)时,它将具有您在其中设置为默认值的属性。这将允许您设置默认值,同时保持它们可见,以便开发人员可以在不希望将来调整其大小的情况下对其进行更改。

    或者,检查由设计器生成的代码,因为它将确切地向您显示它为生成您要查找的行为所做的操作。