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

时间:2009-07-08 14:14:43

标签: .net vb.net winforms visual-studio-2008

我正在创建一个自定义Label控件(通过简单地继承标准Label控件并重新绘制背景和文本),因为我需要一个非常特定的背景和边框。在控件的构造函数中,我将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,并且它可以正常工作。

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

任何想法导致这种行为差异的原因是什么?

4 个答案:

答案 0 :(得分:6)

在标签类中,您应该覆盖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属性将告诉设计者不要将任何代码写入设计器文件。

答案 1 :(得分:3)

我终于让它在VB中工作了。我必须禁用Set语句,实际上将Overridden 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

感谢NascarEd让我指出了正确的方向。

答案 2 :(得分:2)

仅为了将来的信息,要在属性窗口中将autosize属性设置为False,您需要设置一个属性: -

< System.ComponentModel.DefaultValue(假)> _

Public Overrides Property AutoSize()As Boolean ....

答案 3 :(得分:0)

如果您进入正在创建的新控件的设计模式,您应该能够选择该控件并根据需要更改属性。从那时起,无论何时将该控件添加到表单(或其他控件),它都会将您在此处设置的属性设置为默认值。这应该允许您设置默认值,同时保持它们可见,这样开发人员可以在不希望将来调整大小的情况下进行更改。

或者,查看设计人员生成的代码,因为它会准确显示它为生成您正在寻找的行为所做的工作。