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

6

我正在创建一个自定义标签控件(通过继承标准标签控件并重新绘制背景和文本),因为我需要非常特定的背景和边框。在控件的构造函数中,我将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。这不是一个很大的问题,但我不明白为什么行为不同。
有什么想法是什么原因导致了这种行为上的差异吗?

顺便提一下,在构造函数中,我会在设置高度和宽度之前将AutoSize设置为false。 - NascarEd
@NascarEd,谢谢你的留言。我已经尝试了两种方法,但似乎没有什么区别。 - Stewbob
另外一点需要注意的是:在创建自定义控件之后,最好将其放置在一个表单上,并检查设计器生成的代码。设计器通常会执行您意想不到的操作。 - NascarEd
4个回答

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; }
}
可浏览性(browsable)是指在设计时隐藏属性,而DesignerSerializationVisibility属性则告诉设计师不要将任何代码写入设计文件中。

我已经实现了这个,但即使设计师不再显式地将AutoSize属性设置为true(就像以前一样),它仍然明确地设置.Size属性,就好像AutoSize仍然开启一样。也许我会尝试在我的控件中覆盖Size属性。 - Stewbob
虽然这似乎在 VB 中无法正常工作,但我非常感谢您的帮助。这让我更好地了解了创建自定义控件的方法。谢谢! - Stewbob

3

我最终在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

感谢NascarEd帮我指明了正确的方向。

2

未来参考:在属性窗口中设置autosize属性为False,需要设置一个属性:

<System.ComponentModel.DefaultValue(False)> _

公共覆盖属性AutoSize() As Boolean ....


0

如果您进入正在创建的新控件的设计模式,您应该能够选择该控件并随意更改属性。从那时起,每当您将该控件添加到表单(或另一个控件)中时,它将具有您在那里设置的属性作为默认值。这应该允许您设置默认值,同时保持它们可见,以便开发人员可以在将来更改事项时更改它们是否可调整大小。

或者,查看设计师生成的代码,因为它将向您展示确切地执行了哪些操作以生成您正在寻找的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接